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단계를 따르십시오.
- ViM에서 긴 파일 이름 목록을 엽니다.
qa
"a"라는 매크로 기록을 시작하려면 입력하세요 .y$
파일 이름을 추출(복사)하려면 입력하세요 .imv A/
파일 이름 앞에 "mv A/"를 입력 하고 키를 누릅니다Escape
.A B/
줄 끝에 "B/"를 입력 하고 쓰고 를 누릅니다Escape
.pj^
파일 이름을 붙여넣고 다음 줄의 시작 부분으로 이동하려면 입력하세요 .- 매크로 기록을 중지 하려면 누릅니다
q
. VG:normal @a
파일 끝까지 "a" 매크로를 재생하려면 입력하세요 .:wq rename.sh
"rename.sh"라는 bash 스크립트로 저장하고 종료하려면 입력하세요 .- 마지막으로 bash 프롬프트에서
chmod +x rename.sh; ./rename.sh
스크립트를 실행 가능으로 표시를 입력하고 실행합니다.
답변4
이는 루프를 사용하지 않는 POSIX 호환 변형입니다. 항목은 file-list.txt
줄 바꿈으로 구분됩니다.
cd A ; xargs -I{} -- mv -- {} B < file-list.txt
분명히 이 변형은 파일 이름에 개행 문자를 포함하는 것을 허용하지 않습니다. 또한 mv
각 파일에 대해 개별적으로 명령을 호출합니다.
이것데이비드 포스터의 변종.xargs
mv
여러 인수에 대해 단일 인스턴스를 호출하며 mv
긴 파일 목록에 더 효율적입니다. 여전히 파일 이름에 개행 문자가 포함되는 것은 허용되지 않습니다. 이러한 제한을 극복하려면 이 옵션을 사용하고 -0
파일 이름을 (NULL) 문자로 구분할 수 있습니다.\0
cd A ; xargs -r0 -- mv -t B -- < file-list.txt