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
alboxargs -I{} file {}
. Nie powinno byćxargs file {}
. Wydaje mi się, że kiedy wyraźnie podasz -I {}, bash potraktuje to jakfile "Hello World"
. Bez -I {} jest traktowane jakfile Hello World
.-1
opcjęls
, ale jest ona domyślnie włączona, gdy wyjściemls
jest plik lub potok, więc nie potrzebujesz go tutaj. (3) Mylisz się-I
z przestarzałą opcją-i
(małe literyI
).-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ącls
. Masz rację. Do tegofile *
jest najlepszy.-exec
.Odpowiedzi:
-I
Wymaga określonej zastępczy.-i
Opcja obejmie{}
jest zastępczy. W tym miejscu znalazłem jakieś założenia {}man xargs
przynajmniej w Cygwin i CentOS.Wywołanie xargs bez którejkolwiek z opcji nie wymaga symbolu zastępczego i po prostu dołącza STDIN na końcu argumentów.
Po prostu dodaj
echo
do swoich przykładów, aby zobaczyć, co robi xargs:Twój przykład mistakeny używa
{}
:więc
file
cmd widzi argumenty{} Hello World
i błędy.Jeśli chcesz wyraźnie użyć
{}
w xargs:Lub Bez symbolu zastępczego:
xargs, jak wspomniano powyżej, nie potrzebuje {}. Dołącza STDIN na końcu polecenia bez symbolu zastępczego. Użycie {} zwykle oznacza, że chcesz, aby STDIN gdzieś w środku cmd był wykonywany, jak w:
źródło