Как я исключаю определенное расширение из рекурсивного файла, копирующего?

Я хочу скопировать все файлы и 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?

5
задан 8 June 2016 в 08:02

1 ответ

Вы не указываете в своем вопросе, если это - требование для сохранения структуры каталогов в копии или если Вам просто нужна копия файлов. Для простого копирования всех файлов, не названных *.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
1
ответ дан 23 November 2019 в 10:41

Другие вопросы по тегам:

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