목록을 기준으로 모든 파일을 한 폴더에서 다른 폴더로 이동합니다.

목록을 기준으로 모든 파일을 한 폴더에서 다른 폴더로 이동합니다.

A한 폴더에서 다른 폴더로 이동하고 싶은 파일 목록이 있지만 B수동으로 이동하고 싶지는 않습니다. 목록을 반복하고 해당 목록의 각 파일을 이동하는 더 쉬운 방법이 있습니까?

답변1

rsync파일 목록이 한 줄에 하나의 파일 이름이라고 가정하면 를 사용하여 파일을 이동할 수 있습니다 .

rsync -av --remove-source-files --files-from filelist.txt sourceDir/ targetDir/

파일이 절대 이름(즉, 이름이 로 시작하는 경우 /)이면 sourceDir이어야 합니다 /. 그렇지 않으면 루트에 대한 상대 이름이어야 합니다.

$ mkdir src dst
touch src/{one,two,three}
$ cat >filelist.txt <<EOF
one
two
EOF

$ ls src
one  three  two
$ ls dst

$ rsync -av --files-from filelist.txt --remove-source-files src/ dst/
building file list ... done
one
two

sent 165 bytes  received 70 bytes  470.00 bytes/sec
total size is 0  speedup is 0.00

$ ls src
three
$ ls dst
one  two

답변2

GNU 핵심 유틸리티(또는 이러한 특정 기능이 포함된 기타 구현)를 제공하는 경우 이를 사용하여 xargs파일 목록을 기반으로 매개변수 목록을 작성할 수 있습니다.mv

cd A
xargs -rd '\n' -- mv -t B -- < file-list.txt

GNU 유틸리티가 없는 경우에도 읽는 동안 루프를 사용할 수 있습니다. Bash에서는 다음과 같을 수 있습니다:

while IFS= read -r file; do
    mv "A/$file" "B/$file"
done < file-list.txt

답변3

이 문제를 쉽게 해결할 수 있습니다다음의 간단한 10단계를 따르십시오.

  1. ViM에서 긴 파일 이름 목록을 엽니다.
  2. qa"a"라는 매크로 기록을 시작하려면 입력하세요 .
  3. y$파일 이름을 추출(복사)하려면 입력하세요 .
  4. imv A/파일 이름 앞에 "mv A/"를 입력 하고 키를 누릅니다 Escape.
  5. A B/줄 끝에 "B/"를 입력 하고 쓰고 를 누릅니다 Escape.
  6. pj^파일 이름을 붙여넣고 다음 줄의 시작 부분으로 이동하려면 입력하세요 .
  7. 매크로 기록을 중지 하려면 누릅니다 q.
  8. VG:normal @a파일 끝까지 "a" 매크로를 재생하려면 입력하세요 .
  9. :wq rename.sh"rename.sh"라는 bash 스크립트로 저장하고 종료하려면 입력하세요 .
  10. 마지막으로 bash 프롬프트에서 chmod +x rename.sh; ./rename.sh스크립트를 실행 가능으로 표시를 입력하고 실행합니다.

답변4

이는 루프를 사용하지 않는 POSIX 호환 변형입니다. 항목은 file-list.txt줄 바꿈으로 구분됩니다.

cd A ; xargs -I{} -- mv -- {} B < file-list.txt

분명히 이 변형은 파일 이름에 개행 문자를 포함하는 것을 허용하지 않습니다. 또한 mv각 파일에 대해 개별적으로 명령을 호출합니다.

이것데이비드 포스터의 변종.xargsmv​ 여러 인수에 대해 단일 인스턴스를 호출하며 mv긴 파일 목록에 더 효율적입니다. 여전히 파일 이름에 개행 문자가 포함되는 것은 허용되지 않습니다. 이러한 제한을 극복하려면 이 옵션을 사용하고 -0파일 이름을 (NULL) 문자로 구분할 수 있습니다.\0

cd A ; xargs -r0 -- mv -t B -- < file-list.txt

관련 정보