Czy przekazać argument xargs jako ciąg znaków do innego polecenia za pomocą „>”?

9

Załóżmy, że mam kilka plików /tmp/.

ja robię

find . -type f | xargs -iFILES

I chcę zrobić md5sumw każdym pliku, wyprowadzając do pliku o tej samej nazwie, ale z .md5rozszerzeniem.

find . -type f | xargs -iFILES md5sum FILES > FILES.md5

Ma to na celu utworzenie pliku md5 dla każdego pliku znalezionego przez komendę find. Zamiast tego tworzy pojedynczy plik FILES.md5 na dysku z sumami kontrolnymi ze wszystkich plików.

Jak powiedzieć komendzie md5sum, że PLIKI reprezentują bieżącą nazwę pliku, a nie dosłowny ciąg PLIKÓW?

Ktoś nadal używa ciebie MS-DOS
źródło

Odpowiedzi:

4

Potrzebujesz sposobu, aby powiedzieć, że chcesz wysłać dane wyjściowe md5sumdo pliku. Ponieważ find(lub xargs) nie ma tej wbudowanej funkcji i md5sumwie tylko, jak drukować na standardowe wyjście, przekierowanie powłoki jest najprostszym sposobem.

Zauważ, że twoje polecenie nie będzie działać w ogólnym przypadku z innego powodu: format wyjściowy findnie jest formatem wejściowym xargs, różnią się one nazwami plików zawierającymi białe znaki lub \"'. Użyj find -execzamiast tego.

find . -type f -exec sh -c 'md5sum "$0" >"$0.md5"' {} \;
Gilles „SO- przestań być zły”
źródło
7

Aby obsłużyć przekierowanie IO, musisz użyć podpowłoki:

find . -type f | xargs -iFILES sh -c 'md5sum FILES > FILES.md5'
jsbillings
źródło
5

Dzięki GNU Parallel możesz:

find . -type f | parallel md5sum {} \> {}.md5

Dodatkową zaletą jest równoległe uruchamianie md5sum i takie pliki, jak:

My brother's 12" records.txt

nie spowoduje awarii twojego polecenia. Obejrzyj film wprowadzający, aby dowiedzieć się więcej: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Ole Tange
źródło