Z mojego zrozumienia, poniższe słowa powinny oznaczać dokładnie to samo:
ls -1 | xargs file {}
ls -1 | xargs -I{} file {}
jeśli nie podano opcji -I, domyślnie jest to -I {}.
Chcę wyświetlić listę wszystkich plików w bieżącym katalogu i uruchomić file
polecenie na każdym z nich. Niektóre mają spacje w swoich nazwach. Zauważyłem jednak różnicę. Patrz poniżej:
$ ls -1
Hello World
$ ls -1 | xargs file {}
{}: ERROR: cannot open `{}' (No such file or directory)
Hello: ERROR: cannot open `Hello' (No such file or directory)
World: ERROR: cannot open `World' (No such file or directory)
$ ls -1 | xargs -I{} file {}
Hello World: directory
Przy jawnym określeniu -I {} spacje w nazwach plików są traktowane zgodnie z oczekiwaniami.
xargs file
albo xargs -I{} file {}
. Nie powinno być xargs file {}
. Wydaje mi się, że kiedy wyraźnie podasz -I {}, bash potraktuje to jak file "Hello World"
. Bez -I {} jest traktowane jak file Hello World
.
-1
opcję ls
, ale jest ona domyślnie włączona, gdy wyjściem ls
jest plik lub potok, więc nie potrzebujesz go tutaj. (3) Mylisz się -I
z przestarzałą opcją -i
(małe litery I
). -ifoo
jest równoważne -Ifoo
, ale zwykły -i
jest równoważny -I{}
. Ale użyj -I{}
. (4) Jeśli naprawdę chcesz robić to, co mówisz, że chcesz robić, dlaczego po prostu nie powiedzieć file *
?
file
je na nich. Ale wymyśliłem prostszy przykład, używając ls
. Masz rację. Do tego file *
jest najlepszy.
-exec
.