cp dir рекурсивно исключая 2 подкаталога

У меня есть 1 каталог с 9 подкаталогами и 10 файлами. Подкаталог содержит подкаталоги и файлы следующего уровня.

/home/directory/
/home/directory/subdirectory1
/home/directory/subdirectory2
...
/home/directory/subdirectory9
/home/directory/file1
...
/home/directory/file10

Я хочу скопировать все подкаталоги и файлы рекурсивно, кроме:

/home/directory/subdirectory5
/home/directory/subdirectory7

Каков наилучший способ для этого?

9 голосов | спросил dr0zd 27 FebruaryEurope/MoscowbMon, 27 Feb 2012 16:05:31 +0400000000pmMon, 27 Feb 2012 16:05:31 +040012 2012, 16:05:31

3 ответа


0

Может быть, команда find поможет вам:

$ find /home/directory -mindepth 1 -maxdepth 1 -name 'subdirectory[57]' -or -exec cp -r {} /path/to/dir \;
ответил kev 27 FebruaryEurope/MoscowbMon, 27 Feb 2012 16:34:20 +0400000000pmMon, 27 Feb 2012 16:34:20 +040012 2012, 16:34:20
0

Почему бы просто не использовать команду cp следующим образом:

cp -r /home/directory/!(subdirectory5|subdirectory7) /destination
ответил Morten Pedersen 22 AM000000110000002131 2012, 11:38:21
0

У Кева лучше, но это тоже подойдет:

find "/home/folder" -maxdepth 1 | sed -e "/^\/home\/folder$/d" -e "/^\/home\/folder\/subfolder5$/d" -e "/^\/home\/folder\/subfolder7$/d" -e "s/^/cp \-r /" -e  "s/$/ \/home\/target/" | cat

Объяснено:

find "/home/folder" -maxdepth 1 |
// get all files and dirs under /home/folder, pipe output

sed -e "/^\/home\/folder$/d" 
// have sed strip the path being searched, or the cp -r we prepend later will pickup the excluded dirs again.

-e "/^\/home\/folder\/subfolder5$/d"
// have sed strip subfolder5

-e "/^\/home\/folder\/subfolder7$/d"
// have sed strip subfolder7

-e "s/^/cp \-r /"
// have sed prepend "cp -r " to each line

-e  "s/$/ \/home\/target/" | cat
// have sed append targetdir to each line.

Выходы:

cp -r /home/folder/subfolder9 /home/target
cp -r /home/folder/subfolder1 /home/target
cp -r /home/folder/file10 /home/target
cp -r /home/folder/subfolder2 /home/target
cp -r /home/folder/file1 /home/target
cp -r /home/folder/subfolder3 /home/target

Измените | cat на | sh на выполнить команду.

<здесь идет большой отказ от ответственности>

Тебе лучше использовать решение Кева

ответил jon 27 FebruaryEurope/MoscowbMon, 27 Feb 2012 16:47:28 +0400000000pmMon, 27 Feb 2012 16:47:28 +040012 2012, 16:47:28

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132