천 개가 넘는 파일로 가득 찬 디렉토리가 있는데 이름이 약간 깁니다(이름 지정 스타일에서 패턴을 찾을 수 없습니다). 파일명을 단순화하고 싶습니다. 예를 들어:
Bioimage_23335989_Data_22317866_22317867_20140723_1002.pdb
Bioimage_22335990_Data_22318490_22318491_20140723_1009.pdb
Bioimage_23835970_Data_22317866_22317867_20140723_1005.pdb
.....등!
filelist.txt
다음 내용으로 간단한 텍스트 파일( )을 만들었습니다 .
1.pdb Bioimage_23335989_Data_22317866_22317867_20140723_1002.pdb
2.pdb Bioimage_22335990_Data_22318490_22318491_20140723_1009.pdb
3.pdb Bioimage_23835970_Data_22317866_22317867_20140723_1005.pdb
.....등!
누구든지 소스 파일을 읽고 이에 따라 파일 이름을 바꾸는 스크립트( 등)를 제공할 수 있습니까 awk
? sed
다른 곳에서도 유사한 스크립트를 얻을 수 있지만 나에게는 아무 것도 작동하지 않는 것 같습니다.
답변1
filelist.txt
형식이 이미 완벽 하므로 awk 또는 sed가 필요하지 않습니다 .
몇 가지 미리 말씀드릴 점은... 파일 이름에 공백이 없고 각 줄의 두 파일 이름이 공백으로 구분되어 있다고 가정합니다. 또한 나는 가정한다filelist.txt
종료EOF 앞에 EOL이 있습니다.
물론 이 명령을 실행하기 전에 디렉터리를 백업해 두십시오.
#!/usr/bin/env bash
cd /path/to/pdb_files
while read -r line; do
mv $line
done < /path/to/filelist.txt
설명하다
while read -r line; do
: 파일의 각 줄을 반복하여 각 줄을 변수에 배치합니다$line
.mv $line
: 각 줄에는 공백으로 구분된 두 개의 파일 이름이 포함되어 있으므로 인수를 .i.e 에 직접 전달할 수 있습니다mv
. 그러면 파일이 첫 번째 파일 이름에서 두 번째 파일 이름으로 즉시 이동됩니다.
편집하다
방금 귀하의 질문을 다시 읽었습니다. 나는 이것을 파일 이름을 (예를 들어)에서 1.pdb
으로 바꾸고 싶다는 뜻으로 해석합니다 Bioimage_23335989_Data_22317866_22317867_20140723_1002.pdb
. 그 반대를 원하는지 잘 모르겠습니다. 그렇다면 아래 스크립트가 작동합니다.
#!/usr/bin/env bash
cd /path/to/pdb_files
while read -r line; do
mv $(awk '{print $2, $1}' <<<$line)
done < /path/to/filelist.txt
설명하다
mv $(awk '{print $2, $1}' <<<$line)
:$line
두 번째 필드를 읽고 인쇄한 다음 첫 번째 필드를 인쇄합니다. 이 두 파일 이름을 에 인수로 전달합니다mv
.
답변2
while read tname fname
do
mv ${fname} ${tname}
done < filelist.txt