Как скопировать только соответствие файлам, сохранив подкаталоги

Делает daemon управляйте нуждаются в a & в конце. Я не думаю, что это делает. Это может быть источником Вашей проблемы.

6
13.04.2017, 15:36
2 ответа

Можно использовать tar или cpio или pax (если какой-либо из них доступен) скопировать определенные файлы, создавая целевые каталоги по мере необходимости. С tar GNU, для копирования всех регулярных названных файлов *.txt или README.* под текущим каталогом к той же иерархии под ../destination:

find . -type f \( -name '*.txt' -o -name 'README.*' \) |
tar -cf - -T - |
tar -xf - -C ../destination

С просто find, cp, mkdir и оболочка, можно циклично выполниться по желаемым файлам с find и запустите команду оболочки для копирования каждого из них. Это является медленным и громоздким, но очень портативным. Отрывок оболочки получает целевой корневой каталог как $0 и путь к исходному файлу как $1; это создает целевое дерево каталогов по мере необходимости (обратите внимание, что полномочия каталога не сохраняются кодом ниже), затем копирует файл. Отрывок ниже работ над любой системой POSIX и большинством установок BusyBox.

find . -type f \( -name '*.txt' -o -name 'README.*' \) -exec sh -c '
  mkdir -p "$0/${1%/*}";
  cp -p "$1" "$0/$1"
' ../destination {} \;

Можно сгруппироваться sh вызовы; это немного сложно, но может быть в известной мере быстрее.

find . -type f \( -name '*.txt' -o -name 'README.*' \) -exec sh -c '
  for x; do
    mkdir -p "$0/${x%/*}";
    cp -p "$x" "$0/$x";
  done
' ../destination {} +

Если у Вас есть удар ≥4 (я не знаю, является ли Bash Мерзавца достаточно недавним), Вы не должны звонить find, можно использовать ** шаблон шарика для рекурсивного вызова в подкаталоги.

shopt -s globstar extglob
for x in **/@(*.txt|README.*); do
  mkdir -p "../destination/${x%/*}"
  cp -p -- "$x" "../destination/$x"
done
8
27.01.2020, 20:25

Можно попробовать что-то вроде этого:

ls | grep 2 | xargs -n1 -t -i cp -R {} ../testdirTwo/{}

Я попробовал это на своем Linux, и он работает. Отметьте-R параметр в CP, это для рекурсивного, если Вы желаете. Также отметьте-i параметр o xargs, он вставит, он производится туда, где Вы помещаете {}.-t только для повторения команды к stderr.

Моя тестовая структура каталогов была похожа на это:

$ find .
.
./2
./2/f2
./1
./1/f1
./f1
./f2
1
27.01.2020, 20:25

Теги

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