2

Как я могу найти все файлы определенного типа / имени и скопировать их на уровень выше? Вот древовидная структура файловой системы:

germany/
       |
       adventure/
                |
                300x600/
                |      |
                |      file1.jpg
                |      file2.zip
                |
                400x600/
                       |
                       file8.jpg
                       file4.zip
switzerland/
           |
           adventure/...

Существует много страновых папок, около 20, и файлы .zip не гарантированно имеют 3 уровня глубины. В настоящее время я нахожусь в их родительской папке countries/ и я хочу найти и скопировать все файлы .zip на один уровень вверх, в каталог adventure/ соответствующей страны / папки.

Я старался:

find . -type f -name '*.zip' -exec mv {}/.. \;

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

Спасибо!

EDIT: Я играл немного с решениями от ответов и читать много страниц man :). Наконец, я принял решение, которое мне понравилось больше всего, так как оно элегантное и не зависит от оболочки.

Что-то я все еще пытаюсь выяснить:

  1. Есть ли find работу в качестве контура или делать фигурные скобки получить лечение как «список / массив» в других языках программирования? Значение: он заполняется найденными результатами (т. Е. Строками) одновременно и ТО передается команде под -exec?
  2. Почему движение сначала произошло на один уровень вверх, а затем снова на один уровень вверх?
  3. Есть ли способ немедленно сказать mv/cp перейти на уровни -n [вверх / вниз]?

3 ответа3

0

Вы можете сделать его независимым от оболочки и объединить его в одну команду find :

find . -type f -name '*.zip' -exec \
sh -c 'echo cp -- "$0" "$(dirname "$0")"/..' {} \;

Уберите echo когда вы уверены, что оно делает то, что вы хотите.

Используйте find чтобы найти файлы. Запустите оболочку с -exec sh -c , передав найденный файл с {} в качестве первого аргумента этой оболочки. Поэтому в оболочке путь к файлу будет доступен как $0 .

Затем вы можете использовать dirname "$0" и подстановку команд ($(…)), чтобы получить родительский каталог файла. Добавить столько /.. сколько вы хотите пройти выше.

Обратите внимание, что я цитировал имена файлов, чтобы предотвратить неправильное расширение файлов с символами новой строки или пробелами в их имени.

0

Просто быстрая альтернатива, если реальность так проста, как приведенный пример:

cd germany
mv */*/*.zip .

(и там не миллионы файлов)

0

попробовал это с ubuntu zsh 5.0.2:

for pdir in */
do
  cd $pdir
  for dir in */
  do
    cd $dir
    mv */*.zip .
    cd ..
  done
  cd ..
done

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