Поиск и перемещение каталогов в зависимости от типа файла и даты

Пакет nx сильно устарел, и мне пришлось загрузить исходный код. Затем я выбрал Fedora в качестве системы для установки, хотя это ОС Arch.

Запустить nxserver. Я пока не могу к нему подключиться.

2
21.08.2013, 02:11
2 ответа

не Делают - должностное лицо mv справочник, который в настоящее время исследуется , находят . Кажется, что найти путается, когда вы это делаете.

Обходной путь: сначала найдите каталоги, а затем переместите их.

cd "/mnt/user/New Movies/"
find -type f \( -name "*.avi" -or -name ".*mkv" \) -mtime +180 \
  -printf "%h\0" | xargs -0 mv -t /mnt/user/Movies

Объяснение:

  • -printf печатает совпадение в соответствии со строкой формата.
  • % h печатает часть пути совпадения. Это соответствует «$ {0 %/*}» в вашей команде.
  • \0 разделяет предметы с помощью символа null. Это лишь мера предосторожности, если имена файлов содержат новые строки.
  • xargs собирает входные данные из канала, а затем выполняет их аргументы с добавленными входными данными.
  • -0 указывает xargs, что ввод должен быть разделен на нуль, а не на новую строку.
  • mv-t < цель > позволяет вызывать mv со всеми исходными аргументами, добавленными в конце.

Обратите внимание, что это все еще не абсолютно безопасно. Некоторые тайминг планировщика фрик в сочетании с буферами каналов может по-прежнему привести к выполнению mv до поиска , перемещенного из каталога. Чтобы предотвратить даже то, что вы можете сделать это так:

cd "/mnt/user/New Movies/"
find -type f \( -name "*.avi" -or -name ".*mkv" \) -mtime +180 \
  -printf "%h\0" > dirstomove
xargs -0 mv -t /mnt/user/Movies < dirstomove

Фоновое объяснение:

Я понимаю, что происходит с find :

  1. find пересекает каталог /mnt/user/New Movies/. В то время как там он принимает к сведению доступные каталоги в своем кэше.
  2. поиск проходит в один из подкаталогов с помощью системного вызова chdir (subdirname) .
  3. Внутри find находит файл фильма, который проходит через фильтры.
  4. find выполняет mv с заданными параметрами.
  5. mv перемещает каталог в /mnt/user/Movies .
  6. find возвращается в родительский каталог с помощью системного вызова chdir (..) , который теперь указывает на /mnt/user/Movies вместо /mnt/user/New Movies/
  7. find , поскольку он не находит ранее отмеченные каталоги и порождает множество ошибок.

Это предположение основано на ответе на этот вопрос: find -exec mv останавливается после первого exec . Я не знаю, почему найти просто перестает работать в этом случае и выбрасывает ошибки в вашем случае. Пояснением могут служить различные версии find .

0
29.04.2021, 00:47

Установите переменную окружения IFS в IFS=$(echo -en "\n\b");, чтобы оболочка разделяла элементы на основе новых строк, а не пробелов.

Дополнительно это -exec sh -c 'mv "${0%/*}" /mnt/user/Movies' {} \; довольно странно. Если я не ошибаюсь, упростите до -exec mv {} /mnt/user/Movies \;

0
29.04.2021, 00:47

Теги

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