0 votes

résultats incohérents pour basename ?

Dans la suite, pourquoi le troisième exemple de basename y compris le répertoire qui contient le fichier ?

WGroleau@MBP Music % basename Korean/kr_audio.tbz
kr_audio.tbz
WGroleau@MBP Music % basename ./Korean/kr_audio.tbz
kr_audio.tbz
WGroleau@MBP Music % time find . -type f -exec echo "$(basename "{}") ++ $(dirname "{}")" \; > /tmp/tmp
find . -type f -exec echo "$(basename "{}") ++ $(dirname "{}")" \; > /tmp/tmp  3.93s user 6.74s system 87% cpu 12.181 total
WGroleau@MBP Music % head !$
head /tmp/tmp
./Tx-01-00.mp3 ++ .
./Korean/kr_audio.tbz ++ .
./syn_HCA001-Cem.m4a ++ .
./Cetera.amad ++ .
./.DS_Store ++ .
./Japanese/JAI.tbz ++ .
./.localized ++ .
./iTunes SongKong/iTunes Library Extras.itdb ++ .
./iTunes SongKong/iTunes Music Library.xml ++ .
./iTunes SongKong/.DS_Store ++ .

2voto

nohillside Points 82672

Il a fallu creuser un peu mais la réponse est disponible dans Unix et Linux :

  • Substitution de processus (le $(...) partie) se produit avant find est même exécuté
  • Alors avant find même commence, $(basename "{}" est exécuté en retournant {} en transformant votre commande en find . -type f -exec echo "{}" \;
  • Maintenant find démarre et se contente d'échouer chaque fichier trouvé.

La sortie de dirname juste a regardé juste parce que dirname {} (ou en fait dirname ANY-FILE ) renvoie toujours . (voir la partie après Soit le répertoire est "/", soit il n'y a pas de barre oblique. sur dirname.c ).

Comme alternative, vous pouvez utiliser

find . -type f -exec sh -c 'echo "$(basename $1) ++ $(dirname $1)"' _ {} \;

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X