Скрипт для перемещения файлов из подкаталогов в родительский каталог

Я ищу скрипт для перемещения файлов из подкаталогов в родительский каталог

Моя структура папок выглядит следующим образом.

  • Внутри папки AI есть много папок с именами 1,2,3,4,5 ...
  • Все эти папки содержат еще 2 папки с именами B и C.
  • B и C содержат файлы, которые я хочу переместить на один уровень вверх, а затем удалить папки B и C.

Заранее благодарю за любую помощь, которую вы можете оказать мне с этим сценарием

5
задан 6 August 2013 в 18:18

4 ответа

Можно использовать:

find test/*/* -type d | xargs -n1  sh -c 'echo mv -b ${0}/* "$( dirname ${0})" ";" rm -rvf ${0} '

Это просто распечатает Вывод на экране как указано ниже:

mv -b test/1/B/file1 test/1/B/file2 test/1/B/file3 test/1 ; rm -rvf test/1/B
mv -b test/1/C/file1 test/1/C/file2 test/1/C/file3 test/1 ; rm -rvf test/1/C
mv -b test/2/B/file1 test/2/B/file2 test/2/B/file3 test/2 ; rm -rvf test/2/B
mv -b test/2/C/file1 test/2/C/file2 test/2/C/file3 test/2 ; rm -rvf test/2/C
mv -b test/3/B/file1 test/3/B/file2 test/3/B/file3 test/3 ; rm -rvf test/3/B
mv -b test/3/C/file1 test/3/C/file2 test/3/C/file3 test/3 ; rm -rvf test/3/C
mv -b test/4/B/file1 test/4/B/file2 test/4/B/file3 test/4 ; rm -rvf test/4/B
mv -b test/4/C/file1 test/4/C/file2 test/4/C/file3 test/4 ; rm -rvf test/4/C
mv -b test/5/B/file1 test/5/B/file2 test/5/B/file3 test/5 ; rm -rvf test/5/B
mv -b test/5/C/file1 test/5/C/file2 test/5/C/file3 test/5 ; rm -rvf test/5/C

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

3
ответ дан 6 August 2013 в 18:18

Учитывая вашу структуру каталогов, вам не нужно find для этого - оболочки будет достаточно:

# the trailing slash below restricts results to directories
for dir in /path/to/A/*/; do
    mv "$dir"/[BC]/* $dir && rmdir "$dir"/[BC]
done
0
ответ дан 6 August 2013 в 18:18

Второй набор циклов for в приведенном ниже скрипте должен делать то, что вы ищете. Они помечены ...

# move files from subdirs to the parent directory

Первый набор создает тип файловой структуры, которую вы описали, и есть несколько списков файлов (ls), чтобы показать, что происходит.

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

Единственное, что необычно во втором наборе - это внутренняя петля for внутри скобки ( ... ). Это удобный «bashism», который запускает то, что внутри него, в подоболочке, и поэтому cd воздействует только на внутренний цикл for. Если вы не хотите их использовать, удалите их и добавьте cd .. после внутреннего цикла for.

#!/bin/bash

echo "
Current dir= $(pwd)
"

# populate directories
for d1 in 1 2 3
do
  for d2 in B C
  do
    mkdir -p $d1/$d2
    for f in 1 2
    do
      touch $d1/$d2/file$d2$f   # include $d2 in filename so unique when merged
    done
  done
done

echo "
ORIGINAL FILE STRUCTURE...
"
# show dirs & files recursively
ls -lR *

# move files from subdirs to the parent directory
for d1 in 1 2 3
do (                    # run in subshell so 'cd' does not change outer loop dir
  cd $d1                #   cd into dir so mv is simpler
  for d2 in B C
  do
    mv $d2/* .          #     Move files in B and C up to parent dir
    #                   #     NOTE: Files in B with same name as
    #                   #           files in C will be silently overwritten!
    rmdir $d2           #     Remove the now empty B and C dirs (OPTIONAL)
  done
)
done

echo "

FINAL FILE STRUCTURE...
"
# show dirs & files recursively
ls -lR *

echo "
Current dir= $(pwd)
"
0
ответ дан 6 August 2013 в 18:18

Следующие команды будут выполнять работу:

cd /path/to/A
find -mindepth 3 -type f -execdir mv {} .. \;
find -mindepth 2 -type d -exec rm -d {} \;

См. Также man find о различиях между действиями -exec и -execdir.

0
ответ дан 6 August 2013 в 18:18

Другие вопросы по тегам:

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