Trier les fichiers par heure de modification

8

J'ai vu beaucoup de questions et réponses ici en utilisant une construction dans le sens de

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

ou

ls -t | while read i; do

Maintenant, je sais que vous ne devriez pas utiliser ls dans les scripts car il se casse facilement; mais je ne peux pas trouver une meilleure façon d'opérer sur les fichiers dans l'ordre de la dernière modification à la dernière modification (ou vice versa).

Je peux utiliser quelque chose comme:

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

... mais cela rompra toujours avec tous les fichiers qui ont des retours à la ligne dans leurs noms, et est beaucoup plus laid pour démarrer. Y a-t-il une meilleure façon?

evilsoup
la source

Réponses:

8

"Ne pas utiliser ls dans les scripts" est un problème avec POSIX ls "uniquement"; pour GNU ls voir --quoting-style=.

Le tri GNU résout le problème avec --zero-terminated.

S'il doit être compatible, vous pouvez utiliser find ... -execpour passer un nom de fichier à la fois à un script qui fait l'échappement. Si au moins bash est disponible:

start cmd:> testfunc () { echo "${1//$'\n'/\n}"; }
start cmd:> testfunc a$'\n'b
a\nb
Hauke ​​Laging
la source
Ahh, --zero-terminated- merci pour cela, j'aimerais pouvoir vous donner encore plus de points!
evilsoup
... OK, je suis un peu confus par info ls: si je voulais un script pare-balles avec ls, lequel --quoting-styledevrais-je utiliser?
evilsoup
@evilsoup je pense que --quoting-style=escapec'est la façon de choisir.
Hauke ​​Laging
Maintenant, pour créer des fichiers avec des retours à la ligne dans leurs noms pour le tester: P
evilsoup
1
Aussi: je tombe sur un cas extrême où jamais GNU ls --quoting-styleéchoue (pour l'analyse des buts) car il ne cite que les noms de fichiers: lorsque vous avez un espace dans un nom de groupe. Ok, c'est un cas très strage, mais il apparaît dans le shell bash de cygwin, ici vous avez des noms de groupe comme Domain Users.
DavAlPi
4

Le moyen le plus simple est de loin d'utiliser zsh. Le qualificatif glob om trie les correspondances dans l'ordre chronologique inverse; utiliser Ompour l'ordre chronologique.

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

Le Nqualificatif glob entraîne le développement du modèle dans une liste vide si le répertoire est vide. Faites cela *(DNom)pour faire correspondre les fichiers de points.

Gilles 'SO- arrête d'être méchant'
la source
1
Dang, c'est la première fois que je suis tenté de prendre la peine de regarder d'autres coquilles - c'est très bien.
evilsoup