파일과 해당 파일이 들어 있는 디렉터리를 다른 위치에 복사하려고 합니다. 다음과 같은 경로를 찾을 수 있습니다.
find ~/dim_import/* -type f ! -name xdir | cut -d '/' -f 5-10
어느 출력
general/header.txt
scripts/test
scripts/tt
다른 위치에 어떻게 복사할 수 있나요? 예를 들어, 새 위치는
new/general/header.txt
new/scripts/test
new/scripts/tt
문제는 빈 디렉토리가 더 많고 해당 디렉토리를 복사하고 싶지 않고 파일이 있는 디렉토리와 파일 자체만 복사하고 싶다는 것입니다.
노트:배쉬 없이, 사용 sh
.
답변1
쉘 기능만을 사용하는 방법은 다음과 같습니다 POSIX
.
find ~/dim_import/* -type f ! -name xdir -exec sh -c '
p=${1%/*};
d=${p##*/};
f=${1##*/};
mkdir -p new/"$d";
cp "$1" new/"$d"' -- {} \;
답변2
xargs를 사용할 수 있어야 합니다. 당신이 사용할 수있는:
find ~/dim_import/* -type f ! -name xdir | xargs -I {} cp {} new/{}
답변3
이제 파일을 필터링하는 방법을 알았으므로 재귀 복사를 사용하십시오.cp -R
rsync
아니면 그냥 with 옵션을 사용할 수도 있습니다 --prune-empty-dirs
.
rsync --exclude='*xdir*' --prune-empty-dirs ~/dim_import ~/new
참고: 위의 예와 같이 소스에서 후행 슬래시를 사용하지 않으면 dim_import
슬래시도 복사됩니다.
답변4
나는 결국 파일에 글을 썼습니다.
find ~/dim_import/* -type f ! -name xdir | cut -d '/' -f 5-6 > files
그런 다음 "파일" 파일을 반복하여 해당 파일에서 디렉터리를 만들고 거기에 파일을 복사합니다.
while read line; do
fileDir=`echo "$line" | cut -d '/' -f 1` # get folder name
fileName=`echo "$line" | cut -d '/' -f 2` # get file name
cd ~/"sr${srNum}" # go to SR folder
# If proper directory doesn't exist, create
if [ ! -d "$fileDir" ]; then
mkdir "$fileDir"
fi
# Copy file to respected directory
cd $ROOT # go back to dim_import
cp "$fileDir/$fileName" ~/"sr$srNum/$fileDir" # copy file to fileDir folder
cd ~/"sr$srNum/$fileDir" # go to fileDir
chmod u+w "$fileName" # mod the file for write access for changes
cd $ROOT # go back to dim_import
done < files