У меня есть структура папок, как показано ниже.

1/ данных / f4aa9d39291bc37a7cacedfab656a941/ x1.jpg

Первый слот и случайная строка в третьем слоте зависят от папки. (Допустим, для этого примера у меня есть 30 папок на этом верхнем уровне, в возрастающем порядке.)

Мне нужно переместить JPG вверх на два уровня, поэтому он использует эту структуру папок и удаляет эту папку данных в каждом каталоге по мере продвижения:

1/x1.jpg

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

find 1/*/data/*/. -name '*.jpg' -exec cp {} 1/* \;

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

(Я использую терминал MacOS, если это влияет на код).

1 ответ1

0

Если ваша структура каталогов

1/data/f4aa9d39291bc37a7cacedfab656a941/x1.jpg

и только data являются фиксированной строкой, тогда подстановочные знаки в команде поиска будут

find */data/* -name '*.jpg'

Запустите эту команду и посмотрите, соответствует ли результат ожидания.

Запуск пакетного сценария или команды для удаления файлов или каталогов всегда опасен.

Эта команда только переместит файлы в родительский каталог двумя уровнями выше.

find */data/* -name '*.txt' -exec bash -c 'file={};path=${file%/*};name=${file##*/};echo "mv -v $path/$name ${path%%/*}"' \;

Запустите его и посмотрите, будет ли вывод вам в порядке. Он будет печатать только командную строку без фактического ее выполнения.

Чтобы действительно запустить команду, удалите команду echo и двойные кавычки

find */data/* -name '*.txt' -exec bash -c 'file={};path=${file%/*};name=${file##*/};mv -v $path/$name ${path%%/*}' \;

Чтобы удалить пустые каталоги, команда должна быть такой, немного более безопасной, поскольку rmdir удаляет только каталоги empy.

find */data/* -name '*.txt' -exec bash -c 'file={};path=${file%/*};name=${file##*/};echo "mv -v $path/$name ${path%%/*} && rmdir -v $path && rmdir -v ${path%/*}"' \;

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .