따라서 다음 유형의 약 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
"드라이버" 파일의 숫자에서 파생된 파일 이름 배열을 로드한 다음 -t
GNU 옵션을 사용하여 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개의 숫자가 일괄적으로 제공됩니다.