텍스트 파일에 지정된 파일을 BASH의 다른 디렉터리로 이동하는 방법은 무엇입니까? [복사]

텍스트 파일에 지정된 파일을 BASH의 다른 디렉터리로 이동하는 방법은 무엇입니까? [복사]

400개 이상의 이미지가 포함된 디렉토리가 있습니다. 그들 대부분은 부패했습니다. 나는 좋은 것을 알아 냈습니다. 텍스트 파일로 나열됩니다(100개 이상). BASH의 다른 디렉토리로 한꺼번에 이동하려면 어떻게 해야 합니까?

답변1

나는 즉시 이를 수행할 몇 가지 방법을 생각했습니다.

  1. while 루프 사용
  2. xargs 사용
  3. rsync 사용

파일 이름이 한 줄에 하나씩 나열되어 files.txt있고 이를 하위 디렉터리에서 source/하위 디렉터리로 이동하려고 한다고 가정합니다 target.

while 루프는 다음과 같습니다:

while read filename; do mv source/${filename} target/; done < files.txt

xargs 명령은 다음과 같습니다.

cat files.txt | xargs -n 1 -d'\n' -I {} mv source/{} target/

rsync 명령은 다음과 같습니다.

rsync -av --remove-source-files --files-from=files.txt source/ target/

각 접근 방식을 실험하고 테스트하기 위해 샌드박스를 만드는 것이 좋습니다. 예를 들면 다음과 같습니다.

# Create a sandbox directory
mkdir -p /tmp/sandbox

# Create file containing the list of filenames to be moved
for filename in file{001..100}.dat; do basename ${filename}; done >> /tmp/sandbox/files.txt

# Create a source directory (to move files from)
mkdir -p /tmp/sandbox/source

# Populate the source directory (with 100 empty files)
touch /tmp/sandbox/source/file{001..100}.dat

# Create a target directory (to move files to)
mkdir -p /tmp/sandbox/target

# Move the files from the source directory to the target directory
rsync -av --remove-source-files --files-from=/tmp/sandbox/files.txt /tmp/sandbox/source/ /tmp/sandbox/target/

답변2

빠르게GNU 솔루션parallel:

우리가 말하자"좋아요"이미지 파일 이름은 file에 나열 good_img.txt되고 대상 폴더의 이름은 입니다 good_images.

cat good_img.txt | parallel -m -j0 --no-notice mv {} good_images 
  • -m- 명령줄 길이가 허용하는 만큼 인수를 삽입합니다. 여러 작업을 병렬로 실행하는 경우: 작업 간에 매개변수를 균등하게 분배합니다.

  • -j N- 직위 수. N작업을 병렬로 실행합니다 . 0최대한 의미를 부여합니다. 기본값은 100%이며, 이는 CPU 코어당 하나의 작업을 의미합니다.

답변3

한 줄에 파일 이름이 하나만 있는 경우:

xargs -d \\n echo mv -t /target/directory

답변4

Bash 솔루션을 요청한다면 실제로는 명령줄 기반 솔루션을 의미할 것입니다.다른 사람가지다만약에사용하다유형명령줄 도구. 다음은 bash 내장 기능을 사용하는 솔루션입니다(배열/맵 파일 읽기)는 텍스트 파일의 내용을 읽은 다음 이러한 파일 이름을 명령에 전달합니다 mv.

설정

$ touch {a..z}.jpg "bad one.jpg" "good one.jpg"
$ mkdir good
$ cat saveus
j.jpg
good one.jpg
z.jpg

준비하다

$ readarray -t < saveus.txt
$ declare -p MAPFILE
declare -a MAPFILE='([0]="j.jpg" [1]="good one.jpg" [2]="z.jpg")'

$ mv -- "${MAPFILE[@]}" good/

확인하다

$ ls -1 good/
good one.jpg
j.jpg
z.jpg
$ ls "good one.jpg" j.jpg z.jpg
ls: cannot access good one.jpg: No such file or directory
ls: cannot access j.jpg: No such file or directory
ls: cannot access z.jpg: No such file or directory

관련 정보