%EA%B0%80%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%ED%8C%8C%EC%9D%BC%EC%97%90%20%EB%82%98%EC%97%B4%EB%90%98%EC%96%B4%20%EC%9E%88%EB%8A%94%20%EC%88%98%EB%B0%B1%20%EA%B0%9C%EC%9D%98%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%9D%B4%EB%8F%99%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
이름에 ID 번호가 포함되어 있고 이 번호가 텍스트 파일에 한 줄씩 나열되어 있는 수백 개의 파일을 이동해야 합니다.
예를 들어:
The content of `ID.txt`:
1231245
1435466
3454656
3356646
이동해야 하는 파일:
1231245_134.fasta
1231245_134.dna
1435466_345.fasta
1435466_345.dna
3454656_789.fasta
3454656_789.dna
3356646_104.fasta
3356646_104.dna
답변1
(쉘이 "프로세스 대체"를 제공하는 경우) 어떻습니까?
. <(sed 's/^/echo mv /; s/$/* \/target/' ID.txt)
결과가 만족스러우면 에코를 제거합니다.
편집하다(스테판 샤젤라스 제안)
sed 's|.*|mv -- &_* /target/|' ID.txt | sh -v -n
-n
결과에 만족하면 제거하십시오 .
답변2
파일 이름에 공백, 줄 바꿈, 백슬래시 또는 따옴표가 포함되어 있지 않고 프로세스 대체를 지원하는 ksh, zsh 또는 bash와 같은 셸이 있다고 가정하면 다음을 수행할 수 있습니다.
join -t_ <(printf '%s\n' *_* | sort -t_ -k1,1) <(sort ID.txt) |
xargs sh -c 'exec mv -- "$@" /target' sh
답변3
- 의 표현식과 일치하도록
grep
인수를 한 줄에 하나씩 제공할 수 있습니다 .-f FILE
FILE
ID.txt
sed
원하는 것과 정확하게 일치하도록 약간 수정해야 합니다 .^
각 줄의 시작 부분에 a 줄의 시작 부분에서 숫자가 일치하도록 하고_
끝 부분에서는 a가123
일치하지 않도록 합니다123123_
.ls -1
한 줄에 하나의 파일이 나열됩니다.xargs -I FOOBAR
입력 행을 추가하는 대신 FOOBAR 발생을 입력 행으로 바꿉니다.
그래서:
sed -e 's/^/^/' -e 's/$/_/' /path/to/ID.txt > /tmp/ID_regexp.txt
cd /old/dir
ls -1 | grep -f /tmp/ID_regexp.txt | xargs -I FILE mv FILE /new/dir
답변4
순수한 bash
솔루션:
while IFS= read -r p; do mv ${p}* /target; done < ID.txt
< ID.txt
파일을 입력으로 제공합니다while IFS= read -r p
라인을 따라가다mv ${p}* /target
파일의 번호로 시작하는 모든 파일을 디렉터리로 이동합니다/target
.
어떤 명령이 실행될지 제어하기 위해 명령 echo
앞에 쓸 수 있습니다 .mv
$ while IFS= read -r p; do echo mv ${p}* /target; done < ID.txt
mv 1231245_134.dna 1231245_134.fasta /target
mv 1435466_345.dna 1435466_345.fasta /target
mv 3454656_789.dna 3454656_789.fasta /target
mv 3356646_104.dna 3356646_104.fasta /target