Несколько команд mv могут быть выполнены в том же каталоге (состояние состязания)?

Используйте sed, печатающий от соответствия КЛЮЧЕВОГО СЛОВА в конец файла, затем с помощью хвоста для удаления строки КЛЮЧЕВОГО СЛОВА.

sed -n '/KEYWORD/,$p' file | tail -1
5
06.11.2014, 06:09
3 ответа

На самом деле происходит состояние расы (один, который не нанесет вреда, хотя и).

* расширяется на входе в цикл. Если вы запустите второй экземпляр этого сценария одновременно, он, вероятно, ничего не сделает, потому что все файлы, которые он пытается переместить, уже были перемещены. Если в исходном каталоге не создаются файлы во время движущейся операции, то сообщения об ошибках должны быть вашей самой большой проблемой.

Но в целом эта структура очень плохая идея. * расширяется в отсортированный список. AFAIK невозможно деактивировать это. Очевидно, что только сортировка - это кошмар с файлами 400K. См. Человек Bash , раздел «Расширение штрихов»:

После разделения слова, если параметр -f не установлен, Bash сканирует каждое слово для символов *,? И [. Если появится один из этих символов, то слово рассматривается как шаблон, и заменяется в алфавитном сортировке списка файлов, соответствующих шаблону.

Кроме того, вы не должны запустить один экземпляр MV на файл, так как вы можете перемещать несколько файлов одновременно.

Это лучшее решение (в мире GNU):

find . -mindepth 1 -maxdepth 1 -exec mv --target-directory=DIRECTORY {} +
5
27.01.2020, 20:35

еще лучшее решение состояло бы в том, чтобы использовать , Параллель GNU к вставляет несколько аргументов . По умолчанию Параллель будет работать n задания одновременно, с n, являющийся количеством ядер, которые имеет ваш ЦП.

При перемещении большого количества файлов как это: мВ * destdir вы будете иногда получать ошибку:

bash: /bin/mv: Argument list too long

, потому что существует слишком много файлов. Можно вместо этого сделать:

ls -1 | parallel mv {} destdir

Это будет работать mv за каждым файлом. Это может быть сделано быстрее, если mv добирается как много аргументов, которые будут соответствовать на строке:

ls -1 | parallel -m mv {} destdir


опция-m действительно прохладна для перемещения или копирования файлов параллельно:

-m      Multiple arguments. Insert as many arguments as the command
        line length permits. If multiple jobs are being run in
        parallel: distribute the arguments evenly among the jobs.
        Use -j1 to avoid this.
4
27.01.2020, 20:35

Для тех, у кого parallelнет в наличии, как у меня:

find source_dir -type f | xargs -n 1 -P 20 -I '{}' mv '{}' dest_dir/

Вы определяете количество процессов с помощью параметра -Pв xargs(, установленного на 20 в приведенном выше примере ).

0
27.01.2020, 20:35

Теги

Похожие вопросы