Я ищу скрипт для перемещения файлов из подкаталогов в родительский каталог
Моя структура папок выглядит следующим образом.
Заранее благодарю за любую помощь, которую вы можете оказать мне с этим сценарием
Можно использовать:
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
в конце той команды затем это выполнит команду, которая является шоу в выводе.
Учитывая вашу структуру каталогов, вам не нужно find
для этого - оболочки будет достаточно:
# the trailing slash below restricts results to directories
for dir in /path/to/A/*/; do
mv "$dir"/[BC]/* $dir && rmdir "$dir"/[BC]
done
Второй набор циклов for
в приведенном ниже скрипте должен делать то, что вы ищете. Они помечены ...
blockquote>
# 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) "
Следующие команды будут выполнять работу:
cd /path/to/A
find -mindepth 3 -type f -execdir mv {} .. \;
find -mindepth 2 -type d -exec rm -d {} \;
См. Также man find
о различиях между действиями -exec
и -execdir
.