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

Как мы знаем, cp -r исходный_каталог предполагаемый_новый_каталог создает копию исходного каталога с новым именем. Теперь я хочу сделать то же самое, но хочу исключить определенный файл. Я нашел несколько связанных ответов здесь, используя tar и rsync, но в этих решениях мне нужно сначала создать каталог назначения (используя mkdir).
Я честно искал много, но не нашел именно то, что хотел.
На данный момент лучшее, что у меня есть, это:

tar -c --exclude=\*.dll --exclude=\*.exe sourceDir | tar -x -C destDir

(из http://www.linuxquestions.org/questions/programming-9/how-to-copy-an-entire-directory-structure-except-certain-files-385321/)


person iloveX    schedule 24.09.2014    source источник


Ответы (4)


Если у вас есть binutils, вы можете использовать найти для фильтрации следующего cpio для копирования (и создания каталогов):

find <sourceDir>  \( ! -name *.dll \) -a \( ! -name *.exe \) | cpio -dumpv <destDir>
person mpromonet    schedule 24.09.2014

Попробуйте это, исключив файл с помощью «grep -v» ->

cp `ls | grep -v <exclude-file>` <dest-dir>
person dganesh2002    schedule 24.09.2014
comment
Это не скопирует подкаталоги. Вам нужно соответствующим образом изменить команду. - person dganesh2002; 24.09.2014
comment
извините, не понял команду. Куда мне поместить исходный каталог? - person iloveX; 24.09.2014
comment
Здесь @dganesh2002 копирует все файлы из текущего каталога в целевой каталог. OK, если подкаталогов нет, имена файлов не содержат пробелов и количество файлов в текущем каталоге не слишком велико. - person afenster; 24.09.2014
comment
Большое спасибо dganesh2002 и @atycnth. Хотя мне все еще нужно создать dest_dir самому, мне нравится это решение, потому что его механизм прост, и я могу легко его запомнить. - person iloveX; 26.09.2014

Если каталог не очень большой, я писал что-то вроде этого:

src=path/to/source/directory
dst=path/to/destination/directory
find $src -type f | while read f ; do mkdir -p "$dst/`dirname $f`"; cp "$f" "$dst/$f" ; done

Здесь мы перечисляем все обычные файлы в $src, перебираем этот список и для каждого файла создаем каталог в $dst, если он еще не существует (опция -p для mkdir), затем копируем файл в этот каталог.

Приведенная выше команда скопирует все файлы. Наконец, просто используйте

find $src -type f | grep -v whatever | while ...... # same as above  

чтобы отфильтровать файлы, которые вам не нужны (например, \.bak$, \.orig$ или любые другие файлы, которые вы не хотите копировать).

person afenster    schedule 24.09.2014

Переместите все исключаемые файлы в домашний или другой каталог, скопируйте каталог, содержащий все оставшиеся файлы, в папку назначения, затем восстановите все исключаемые файлы.

#cd mydirectory
#mv exclude1 exclude2 /home/
#cp mydirectory destination_folder/
#cd /home/
#mv eclude1 exclude2 mydirectory/
person Onyson    schedule 26.03.2017