Файлы сценариев Bash с помощью find и xargs - PullRequest
1 голос
/ 18 марта 2011

Когда я запускаю shasum из нескольких каталогов в одном файле, я получаю то, что ожидаю и в конечном итоге хочу:

shasum 2010/Whitmore/The\ Astrophysical\ Journal\ 2010\ Whitmore.pdf
5da84767c2301f29ed3b7db7542167150fe63b8b  2010/Whitmore/The Astrophysical Journal 2010 Whitmore.pdf

Когда я запускаю find из того же каталога, в нем перечислены файлы без проблем:

find 2010/Whitmore/* | xargs -0
2010/Whitmore/The Astrophysical Journal 2010 Whitmore.pdf

Я пытался написать bash-скрипт (или просто одну строку), который будет возвращать отдельный shasum для каждого файла, найденного функцией find (их много), вместе с его именем файла. Передача имен файлов в shasum не работает ни в одной из комбинаций, которые я пробовал.

Я ожидаю, что проблема связана с пробелами в имени файла, но после поиска в Google, пытаясь найти несколько комбинаций find / xargs / ls (и различные комбинации того, что, похоже, работает для других людей, включая флаги -print0), я до сих пор не могу найти способ запустить shasum для каждого файла в этих каталогах.

Пример вывода, который я хочу (при условии, что под Whitmore есть 2 файла) на случай, если есть совершенно другой способ получить этот результат:

find 2010/Whitmore/* | xargs -0 | shasum
5da84767c2301f29ed3b7db7542167150fe63b8b  2010/Whitmore/The Astrophysical Journal 2010 Whitmore.pdf
4d2b0a6da00473133b4617d67d9249da3d05cc19  2010/Whitmore/arXiv 2010 Whitmore.pdf

Я на Mac OSX 10.6

Ответы [ 5 ]

3 голосов
/ 18 марта 2011

Как насчет использования опции -exec find?

find 2010/Whitmore/* -exec shasum {} \;

1 голос
/ 21 марта 2011

Если ваши диски быстрые, возможно, вы захотите запустить несколько параллельных:

find 2010/Whitmore/* -type f | parallel shasum

Чтобы узнать больше о GNU Parallel, посмотрите вступительное видео (если вы астрофизик, вы будете рады, что сделали это):http://www.youtube.com/watch?v=OpaiGYxkSuQ

0 голосов
/ 22 июня 2013

вместо:

найти 2010 / Whitmore / * |xargs -0 |shasum

вы должны использовать

найти 2010 / Whitmore / * |xargs shasum

0 голосов
/ 15 августа 2012

Чтобы обойти проблему с пробелами в именах файлов, используйте '\ 0' в качестве разделителя файлов:

find 2010/Whitmore/ -type f -print0 | xargs -0 -l -P 2 shasum

Аргумент -P для xargs указывает, сколько параллельных процессов он должен запустить.

0 голосов
/ 18 марта 2011

делает

find -type f | sed 's/./\\&/g' | xargs shasum

работа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...