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

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

따라서 다음 유형의 약 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개의 숫자가 일괄적으로 제공됩니다.

관련 정보