Попытка найти файлы, содержащие идентификатор, а затем переместить их в новый каталог в терминале - PullRequest
0 голосов
/ 04 февраля 2020

Я новичок в этом деле и, похоже, столкнулся с проблемой. По сути, у меня есть много файлов с именами, содержащими ключевое слово (назовем его «Category1») в каталоге. Например:

AB C -Category1-XYZ.txt

Я пытаюсь переместить их из каталога в другой каталог с тем же именем, что и Ключевое слово.

Я начал с этого:

find /path_A -name "*Category1*" -exec mv {} /path_A/Category1 \;

Выделено что-то вроде этого:

mv: переименовать / path_A / Category1 в / path_A / Category1 / Category1: Неверный аргумент

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

find /path_A -name "*Category1*" \(! -type d \) -exec mv {} /path_A/Category1 \;

Это переместило файлы из их исходного местоположения туда, где я их хотел, но все равно дало мне что-то вроде:

mv: / path_A / Category1 / AB C -Category1-XYZ.txt и /path_A/Category1/ABC-Category1-XYZ.txt идентичны

Я не эксперт, поэтому я мог быть неправым ... но я считаю, что команда пытается найти и переместить файлы из исходного каталога, а затем найти их снова. Каталог Category1 является подкаталогом начальной точки / path_A, поэтому я считаю, что он находит только что перемещенные файлы в каталоге Category1 и пытается переместить их снова.

Может кто-нибудь помочь мне решить эту проблему?

enter image description here

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Вы создаете новые файлы, которые find пытается обработать. Самый безопасный подход - переместить их куда-либо еще, кроме path_A, который вы ищете с помощью find.

Или вы можете использовать prune, чтобы игнорировать этот каталог, если у вас нет других подходящих каталогов:

find /path_A -name '*Category1*' -prune -type f -exec mv {} /path_A/Category1/ \;
1 голос
/ 04 февраля 2020

Хотя еще одно сообщение было принято, позвольте мне опубликовать правильный ответ.
Не могли бы вы попробовать:

find /path_A -name 'Category1' -prune -o -type f -name '*Category1*' -exec mv -- {} /path_A/Category1/ \;

Параметр -prune скорее команда, чем условие. Он сообщает find игнорировать дерево каталогов, заданное условиями перед -prune. В этом случае он исключает каталог Category1 из поиска. Следующий -o является логическим OR и может интерпретироваться как instead или else. Порядок опций имеет значение.
Обратите внимание: 1-й category1 - это имя каталога, который нужно исключить, а 2-й *Category1* - это имена файлов, которые нужно найти.

Если вы не уверены, какие файлы являются результатом find, попробуйте выполнить:

find /path_A -name 'Category1' -prune -o -type f -name '*Category1*' -print

, затем настройте параметры, чтобы увидеть изменение вывода.

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