
*.data라는 이름의 데이터 파일을 제외한 모든 파일과 하위 디렉터리를 대상 디렉터리에 복사하고 싶습니다.
[ichen@ui01 sub_test]$ ls
a.cxx a.data subdir
[ichen@ui01 sub_test]$ ls subdir/
sub_a.cxx sub_a.data
보시다시피 외부 디렉토리와 하위 디렉토리에 각각 2개의 데이터 파일이 있습니다. 나는 다음 명령을 사용했습니다.
[ichen@ui01 sub_test]$ cp -r !(*.data) ../destination_dir/
*.data를 제외한 모든 파일을 대상에 복사하려고 했지만 하위 디렉터리에서는 작동하지 않습니다.
[ichen@ui01 destination_dir]$ ls
a.cxx subdir
[ichen@ui01 destination_dir]$ ls subdir/
sub_a.cxx sub_a.data
위에서 이 명령이 첫 번째 디렉터리에서만 작동하는 것을 볼 수 있습니다. 모든 하위 디렉터리에서 작동하도록 하려면 어떻게 해야 합니까?
답변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와 일치하지 않는 하위 폴더에서 모든 파일과 폴더를 찾은 다음 각각에 대해 다음을 수행합니다.
파일이 대상 디렉토리 아래에 일치하는 디렉토리를 만드는 경우 파일이 디렉토리인지 테스트하거나, 파일인 경우 대신 대상에 복사합니다.
편집: 쉘 스크립트 버전 추가:
#!/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