파일 이름 키워드(ID)가 텍스트 파일에 나열되어 있는 수백 개의 파일을 이동하는 방법은 무엇입니까?

파일 이름 키워드(ID)가 텍스트 파일에 나열되어 있는 수백 개의 파일을 이동하는 방법은 무엇입니까?

이름에 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)

결과가 만족스러우면 에코를 삭제하세요.

편집하다(Stefan Chazeras가 제안함)

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 FILEFILE
  • ID.txtsed원하는 것과 정확하게 일치하도록 약간 수정해야 합니다 . ^각 줄의 시작 부분에서 줄 시작 부분의 숫자는 일치하지만 _끝 부분의 숫자는 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

관련 정보