Я хочу скопировать все файлы и subdirs кроме файла данных который названный *.data к целевому dir.
[ichen@ui01 sub_test]$ ls
a.cxx a.data subdir
[ichen@ui01 sub_test]$ ls subdir/
sub_a.cxx sub_a.data
Вы видите, существует 2 файла данных во внешнем dir и subdir соответственно. Я использовал эту команду:
[ichen@ui01 sub_test]$ cp -r !(*.data) ../destination_dir/
нацеленный для копирования всех файлов кроме *.data месту назначения но это не работа в subdir:
[ichen@ui01 destination_dir]$ ls
a.cxx subdir
[ichen@ui01 destination_dir]$ ls subdir/
sub_a.cxx sub_a.data
Вы видите выше той этой команды, просто работают над первым dir, как я могу сделать это работами во всех subdirs?
Вы не указываете в своем вопросе, если это - требование для сохранения структуры каталогов в копии или если Вам просто нужна копия файлов. Для простого копирования всех файлов, не названных *.data, Вы могли использовать это:
find . -type f ! -name '*.data' | xargs cp -t ../destination_dir/
С другой стороны, если Вы хотите сохранить структуру каталогов, Вы могли бы использовать что-то вроде этого:
for file in `find . ! -name '*.txt' | sed 's/^.\///'`; do if [ -d "./$file" ]; then mkdir -p "../destination_dir/$file"; else cp "./$file" "../destination_dir/$file"; fi; done
Не уверенный, если существует более простой способ сделать, это, но эта команда делает следующее:
Найдите все файлы и папки в текущем каталоге, или это - подпапки, не соответствующие *.data затем для каждого:
Тест, если файл является каталогом, если это, делает каталог соответствия под целевым dir, или если это - файл, он копирует его в место назначения вместо этого.
Править: Добавление версии сценария оболочки:
#!/bin/bash
# Disable shell glob expansion within the script
# Required to stop bash from expndinging the glob in $1
set -f
for file in `find . ! -name $1 | sed 's/^.\///'`
do if [ -d "./$file" ]; then
mkdir -p "$2/$file"
else
cp "./$file" "$2/$file"
fi
done