텍스트 파일 목록에서 특정 파일을 이동하거나 복사하는 방법

텍스트 파일 목록에서 특정 파일을 이동하거나 복사하는 방법

따라서 다음 유형의 파일 중 200개 정도의 디렉토리가 있습니다.

gre_6_c1_d34567.h3
gre_6_c1_d95543.h3
gre_6_c1_d42354.h3
gre_6_c1_d01452.h3
gre_6_c1_d23168.h3
gre_6_c1_435435.h3

이 파일들 사이의 유일한 차이점은 d. d이 파일 중 약 50개에 대한 번호 만 포함하는 텍스트 파일이 있습니다 . 전체 파일 이름을 얻을 수 있다면 좋겠지만 이 텍스트 파일은 다른 스크립트의 출력입니다. d텍스트 파일의 번호를 사용하여 이러한 파일을 다른 디렉터리로 이동할 수 있는 방법이 있습니까 ?

답변1

sed e플래그 사용 :

sed 's|^\(.*\)$|mv gre_6_c1_\1.h3 newdir/|e' list.txt

위의 파일을 이동하여 newdir/그에 따라 변경합니다.

나는 list.txt에서 숫자가 아래와 같이 새 줄로 구분되어 있다고 가정합니다.

d34567
d23168

다음을 실행하여 확인하세요.

sed 's|^\(.*\)$|mv gre_6_c1_\1.h3 newdir/|' list.txt

답변2

4를 사용하면 bash"드라이버" 파일의 숫자에서 파생된 파일 이름으로 배열을 로드한 다음 -tGNU 옵션을 사용하여 mv한 번에 디렉터리로 이동할 수 있습니다. 메모

#read contents of driver_file into an array arr using mapfile
mapfile -t arr <driver_file

#define prefix and suffix variables
prefix=gre_6_c1_d
suffix=.h3

#prefix each array element
arr=("${arr[@]/#/$prefix}")

#suffix each array element
arr=("${arr[@]/%/$suffix}")

#use GNU mv's -t facility to move files into newdir
mv -t newdir/ "${arr[@]}"

답변3

파일에서 숫자를 하나씩 읽고 이동을 수행합니다(POSIX 쉘을 가정):

while read -r number; do
   name="gre_6_c1_d$number.h3"
   [ -f "$name" ] && mv -i "gre_6_c1_d$number.h3" /other/directory
done <number.list

이는 또한 파일을 다른 디렉토리로 이동하기 전에 숫자가 현재 디렉토리에 존재하는 파일의 이름을 생성하는지 확인합니다. 또한 이 mv -i명령은 기존 파일을 덮어쓰기 전에 확인을 요청합니다.


이 질문에 태그가 지정되었으므로, 우리는 xargs숫자 목록을 생성하도록 요청할 수 있습니다.

xargs sh -c '
    for number do
        name="gre_6_c1_d$number.h3"
        [ -f "$name" ] && mv "gre_6_c1_d$number.h3" /other/directory
    done' sh <number.list

속도가 향상되지는 않지만 병렬로 실행하기 위한 플래그를 xargs제공 하면 -P속도가 약간 향상될 수 있습니다.

xargs -P 5 -n 10 -h sh -c '
    for number do
        name="gre_6_c1_d$number.h3"
        [ -f "$name" ] && mv "gre_6_c1_d$number.h3" /other/directory
    done' sh <number.list

이는 최대 5개의 루프 복사본을 병렬로 시작하고 각각 최대 10개의 숫자를 일괄적으로 제공합니다.

관련 정보