Intereting Posts
Sniffing машина VirtualBox за NAT Автоматически монтировать сетевой диск, если он доступен Добавить пользователя ssh с минимальными правами на резервное копирование «Git show» показывает странные символы на XTerm импорт данных из текстового файла в сценарий bash Ошибка при загрузке разделяемых библиотек после установки программы FATAL: нет загрузочной среды! Система остановлена Статический IP-код U-boot не кажется «применимым», Перемещение по вложенным папкам с использованием сценария bash Два монитора: Intel VGA + Nvidia DVI что занимают пространство на overlayfs Почему служба FreeRADIUS не будет работать в Centos? Переключатель ISP при сбое подключения (избыточное подключение к Интернету) Подстановка на месте для строк, соответствующих некоторому шаблону в заданном наборе файлов Как я могу использовать команду find для отображения всех типов файлов в каталоге и во всех подкаталогах?

Использование `sem` для параллельного выполнения скрипта

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

Когда я пытаюсь запустить тот же скрипт с sem , я сталкиваюсь с No such file or directory ошибками No such file or directory .

Пример – нет параллельных потоков

 find -type d -links 2 | while read i; do \ find "$i" -type f -print0 | xargs -r0 md5sum | awk '{ print $1 }' \ | sort | md5sum | xargs -I {} echo {} $i ; \ done 

Дает мне:

 e94d32e2a683d46d49c7580d649f7888 - ./Daft Punk/Alive 2007 2 e94d32e2a683d46d49c7580d649f7888 - ./Daft Punk/Alive 2007 

Пример – с использованием sem

 find -type d -links 2 | while read i; do sem -j+0 \ find "$i" -type f -print0 | xargs -r0 md5sum | awk '{ print $1 }' \ | sort | md5sum | xargs -I {} echo {} $i ; \ done; sem --wait 

Дает мне:

 find: `./Daft': No such file or directory find: `Punk/Alive': No such file or directory find: `2007': No such file or directory find: `2': No such file or directory d41d8cd98f00b204e9800998ecf8427e - ./Daft Punk/Alive 2007 2 find: `./Daft': No such file or directory find: `Punk/Alive': No such file or directory find: `2007': No such file or directory d41d8cd98f00b204e9800998ecf8427e - ./Daft Punk/Alive 2007 

Вопросов:

  1. Почему разница в поведении?
  2. Как удалить / исправить No such file or directory из sem ?
  3. Есть ли какие-либо другие улучшения, которые я мог бы сделать в сценарии? (есть много awk и xargs )

Самое простое решение – процитировать команду, переданную в sem:

 sem -j+0 "find \"$i\" -type f -print0" 

Вы можете видеть разницу в этом примере

 $ sem -j 8 echo "aa" aa $ sem -j 8 'echo "aa"' aa 

Вместо этого используйте параллель:

 doit() { i="$1" find "$i" -type f -print0 | xargs -r0 cat | md5sum | awk '{ print $1 }' | sort | md5sum } export -f doit find -type d -links 2 | parallel --tag doit