400개 이상의 이미지가 포함된 디렉토리가 있습니다. 그들 대부분은 부패했습니다. 나는 좋은 것을 알아 냈습니다. 텍스트 파일로 나열됩니다(100개 이상). BASH의 다른 디렉토리로 한꺼번에 이동하려면 어떻게 해야 합니까?
답변1
나는 즉시 이를 수행할 몇 가지 방법을 생각했습니다.
- while 루프 사용
- xargs 사용
- 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