수천 개의 파일이 포함된 디렉토리가 있고 각 파일의 복사본이 있습니다. 한 가지 예:
file1.txt
file1.jpg.txt
file2.txt
file2.jpg.txt
모든 *.txt 파일을 삭제하고 *.jpg.txt를 유지한 다음 모든 *.jpg.txt의 이름을 *.txt로 바꾸고 싶습니다.
OpenSuse 12에서 실행 중입니다.
답변1
@roaima가 언급했듯이 먼저 파일을 삭제할 필요는 없으며 파일을 이동할 때 이전 파일을 자동으로 덮어쓰게 됩니다.
한 가지 방법은 bash에서 for 루프를 사용하는 것입니다.
for f in *.jpg.txt; do mv $f ${f/%.jpg.txt/.txt}; done
설명하겠습니다.
for f in *.jpg.txt; do <command>; done
: 각 파일에 대해 명령을 실행합니다*.jpg.txt
. 파일 이름은 실행 중에 변수에 저장됩니다f
.${f/%.jpg.txt/.txt}
: 의 값$f
이지만 마지막 항목.jpg.txt
은 로 대체됩니다.txt
. 바라보다https://www.tldp.org/LDP/abs/html/parameter-substitution.html이에 대해 자세히 알아보세요.mv $f ${f/%.jpg.txt/.txt}
: 이전 파일의 이름을.jpg
.
이 코드를 실행하기 전에 다음을 실행하여 코드가 올바르게 수행되는지 확인할 수 있습니다.
for f in *.jpg.txt; do echo $f ${f/%.jpg.txt/.txt}; done
그러면 이동할 파일 쌍이 인쇄됩니다.
답변2
#!/bin/bash
## to remove ".txt" files
# this will keep the files which removing in txt
# you can see delete file on the script path
ls -lrth | grep ".txt" | grep -v "jpg" | awk -F' ' {'print $9'} > delete
terminal=`tty`
exec < ${delete=delete}
while read line
do
rm -rf $line
done
exec < $terminal
## Renaming the files
# this will keep the files which we are renaming
# you can see rename file on the script path
ls -lrth | grep -i "jpg" | awk -F' ' {'print $9'} > rename
terminal=`tty`
exec < ${rename=rename}
while read line
do
nn=`echo $line | sed 's/.jpg//gi'`
mv $line $nn
done
exec < $terminal