TXT 파일에 나열된 모든 파일을 한 위치에서 다른 위치로 복사해야 합니다.
/1132526906_tt_nad87_1.jpg /thumb/t1132526906_tt_nad87_1.jpg
/1132526906_tt_nad87_10.jpg /thumb/t1132526906_tt_nad87_10.jpg
/1132526906_tt_nad87_11.jpg /thumb/t1132526906_tt_nad87_11.jpg
/1132526907_tt_nad87_12.jpg /thumb/t1132526907_tt_nad87_12.jpg
/1132526907_tt_nad87_13.jpg /thumb/t1132526907_tt_nad87_13.jpg
/1132526908_tt_nad87_14.jpg /thumb/t1132526908_tt_nad87_14.jpg
CSV 파일을 생성하고 사용 가능한 문자 중 일부를 사용하여 source
나눌 수 있습니다.target
예
제 생각에는복사1132526906_tt_nad87_1.jpg
에서 까지의 ./
파일 - /thumb/t1132526906_tt_nad87_1.jpg
이름이 변경되고 이동되었습니다.
질문
이를 수행할 수 있는 명령줄 명령이 있습니까? 예제를 찾았지만 이것들은 복사만 가능합니다(이름을 바꿀 수는 없음).
고쳐 쓰다
나는 이 스크립트를 만들었습니다:
#!/bin/bash
input="/data/web/web/gallery/data.csv"
while IFS=',' read from to
do
echo "from: $from, to: $to"
done < "$input"
data.csv
그러나 어떤 줄도 "반향"되지 않으며 파일을 읽지 않은 것 같습니다 . 뭐가 문제 야?
답변1
OP의 예에서 이름 바꾸기 및 변경 사항은 상당히 일관된 것으로 보입니다. 예를 들어 filename.jpg
항상 "t" 접두사가 붙은 동일한 경로인 것 같습니다 thumb/tfilename.jpg
. 그렇다면 더 간단한 방법이 있습니다.
모두 "thumb/" 디렉토리로 전송된 경우.
현재 디렉터리에는 테스트 파일 abc.jpg 및 xyz.jpg가 있습니다.
샘플 파일 목록은 다음과 같습니다.
$ cat testfile
abc.jpg
xyz.jpg
시험
echo를 사용하여 명령의 테스트 버전을 실행하여 코드가 수행할 작업을 확인하는 것이 도움이 될 수 있습니다.
$ while read my_file; do
echo cp -a "$my_file" "thumb/t$my_file"
done < testfile
시험 결과:
cp -a abc.jpg thumb/tabc.jpg
cp -a xyz.jpg thumb/txyz.jpg
while read my_file; do ... done
구문은 stdin을 한 줄씩 처리합니다.< testfile
while 문이 표준 입력을 읽을 수 있도록 표준 입력으로<
리디렉션하는 데 사용됩니다 .testfile
my_file
코드 본문에서 볼 수 있듯이 입력을 유지하기 위해 만든 변수입니다.$my_file
cp
파일 이름에 명령이 인수를 식별하는 데 사용하는 공백을 깨뜨릴 수 있는 공백이나 기타 이상한 문자가 포함된 경우 잠재적인 문제를 방지하려면 따옴표를 사용하십시오.
결정적인
테스트 에코 결과에 만족하면 에코를 제거하여 실제로 명령을 실행할 수 있습니다.
$ while read my_file; do
cp -a "$my_file" "thumb/t$my_file"
done < testfile
디렉터리를 검사하면 thumb/
거기에 복사된 두 개의 테스트 파일이 표시됩니다.
피드백이 포함된 최종 결과
기본적으로 cp
오류가 없는 한 피드백은 제공되지 않습니다. 따라서 수백 또는 수천 개의 파일을 복사하는 경우 아무 일도 일어나지 않는 것처럼 나타날 수 있습니다. 피드백을 보려면 세부 옵션을 사용하십시오 -v
.
$ while read my_file; do
cp -av "$my_file" "thumb/t$my_file"
done < testfile
결과:
`abc.jpg' -> `thumb/tabc.jpg'
`xyz.jpg' -> `thumb/txyz.jpg'
답변2
가장 간단한 것은 다음과 같습니다 xargs
.
< file-list.txt xargs -n2 cp -v