파일이 있는 디렉토리만 복사

파일이 있는 디렉토리만 복사

파일과 해당 파일이 들어 있는 디렉터리를 다른 위치에 복사하려고 합니다. 다음과 같은 경로를 찾을 수 있습니다.

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

관련 정보