относительно сценария оболочки - PullRequest
1 голос
/ 09 октября 2011

Мне нужно использовать следующий сценарий оболочки

find . -type f -exec sh -c '
mv "$0" "${0%/*}/$(printf "%s\n" "${0##*/}" | sha1sum | cut -d" " -f1)"
' {} \;

Но я не понимаю, как работает этот сценарий?Например, как анализировать

mv "$0" "${0%/*}/$(printf "%s\n" "${0##*/}" | sha1sum | cut -d" " -f1)"
' {} \;

по частям?Спасибо.

1 Ответ

2 голосов
/ 09 октября 2011
printf "%s\n" "${0##*/}"

${0##*/} берет путь $0 и удаляет все имена каталогов, оставляя только имя файла. Команда printf добавляет новую строку в конец, а затем это имя файла передается в ...

| sha1sum | cut -d" " -f1

Это вычисляет хэш SHA-1 имени файла и затем использует cut для извлечения только хеша из вывода sha1sum.

${0%/*}

Это противоположно ${0##*/} - этот получает каталоги из $0 и выбрасывает имя файла.

Так эффективно, что в итоге получается:

mv "$DIR/$FILENAME" "$DIR/$HASH_OF_FILENAME"

На английском языке он переименовывает каждый найденный файл в хэш SHA-1 исходного имени файла.


Что бы это ни стоило, его можно немного упростить и сделать более читабельным. Я мог бы написать команду mv как:

mv "$0" "$(dirname "$0")/$(basename "$0" | sha1sum | awk "{print \$1}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...