Classificar arquivos por hora da modificação

8

Eu já vi muitas perguntas e respostas aqui usando uma construção ao longo das linhas de

list_dir=`ls -t /path/to/dir/`
for i in $list_dir; do

ou

ls -t | while read i; do

Agora, eu sei que você não deve usar ls em scripts porque ele quebra facilmente; mas não consigo encontrar uma maneira melhor de operar arquivos, desde a última modificação até a mais recente (ou vice-versa).

Eu posso usar algo como:

find . -type f -printf '%T@ %p\n' | sort -n | cut -d ' ' -f 2- | while read i; do...

... mas isso ainda será interrompido com qualquer arquivo que tenha novas linhas em seus nomes e seja muito mais feio de inicializar. Existe uma maneira melhor?

evilsoup
fonte

Respostas:

8

"Não use ls em scripts" é um problema com o POSIX ls "only"; para GNU ls veja --quoting-style=.

A classificação GNU resolve o problema com --zero-terminated.

Se precisar ser compatível, você poderá usar find ... -execpara passar um nome de arquivo por vez para um script que faz a fuga. Se pelo menos o bash estiver disponível:

start cmd:> testfunc () { echo "${1//$'\n'/\n}"; }
start cmd:> testfunc a$'\n'b
a\nb
Hauke ​​Laging
fonte
Ahh --zero-terminated- obrigado por isso, eu gostaria de poder lhe dar ainda mais pontos!
Evilsoup 27/05
... OK, estou um pouco confuso com info ls: se eu queria um script à prova de balas com ls, qual --quoting-styledevo usar?
Evilsoup
@evilsoup Eu acho que --quoting-style=escapeé o caminho para escolher.
Hauke ​​Laging
Agora, crie alguns arquivos com novas linhas em seus nomes para testá-lo: P
evilsoup
1
Também: Eu me deparo com um caso extremo em que o GNU ls --quoting-stylefalha (para analisar propositalmente) porque ele apenas cita nomes de arquivos: quando você tem um espaço no nome de um grupo. Ok, é um caso muito difícil, mas ele aparece no cygwin bash shell, aqui você tem nomes de grupos como Domain Users.
DavAlPi
4

A maneira mais fácil, de longe, é usar o zsh. O qualificador glob classifica as om correspondências em ordem cronológica inversa; use Ompara ordem cronológica.

for x in /path/to/dir/*(Nom); do …

O Nqualificador glob faz com que o padrão se expanda para uma lista vazia se o diretório estiver vazio. Faça isso *(DNom)para corresponder aos arquivos de ponto.

Gilles 'SO- parar de ser mau'
fonte
1
Caramba, esta é a primeira vez que me sinto tentada a olhar para outras conchas - isso é muito bom.
Evilsoup