내 파일 이름을 바꾸기 위해 bash 스크립트를 만들고 있습니다. 파일은 같은 폴더에 있으며 모두 다음과 같습니다.
1xxx_(문자열)=(문자열)=1234567890
이제 내가 원하는 것은 마지막 1234567890만 남기는 것입니다. 기본적으로 =의 첫 번째 발생부터 두 번째 발생까지 모든 문자를 제거합니다.
답변1
쉘의 매개변수 확장 기능을 사용할 수 있습니다.
${parameter#word}
${parameter##word}
Remove matching prefix pattern. The word is expanded to produce
a pattern just as in pathname expansion. If the pattern matches
the beginning of the value of parameter, then the result of the
expansion is the expanded value of parameter with the shortest
matching pattern (the ``#'' case) or the longest matching pat‐
tern (the ``##'' case) deleted.
그처럼
for file in *; do echo mv -- "$file" "${file##*=}"; done
( echo
올바른 일을 하는 것 같으면 제거하세요).
발생할 수 있는 한 가지 문제는 접두사를 제거하면 파일 이름이 고유하지 않게 될 수 있다는 것입니다. -n
또는 옵션을 사용하여 --no-clobber
이러한 사례 이름 변경을 건너뛰도록 선택할 수 있습니다 mv
.
for file in *; do mv --no-clobber -- "$file" "${file##*=}"; done
또는 -b
또는 옵션을 사용하여 --backup
다른 백업을 생성하십시오 . 가장 간단합니다.
for file in *; do mv --backup=numbered -- "$file" "${file##*=}"; done
이렇게 하면 구별 접미사 등이 추가됩니다 .~1~
..~2~
답변2
Perl 이름 바꾸기 스크립트(Debian/Ubuntu의 표준 또는 여기에서 사용 가능:http://tips.webdesign10.com/files/rename.pl.txt)은 정규식을 기반으로 파일 이름을 바꿉니다. -n
실제로 이름을 바꾸지 않고 지정된 파일만 인쇄 하므로 작업을 수행하기 전에 테스트할 수 있습니다.
# Check before renaming...
$ rename -n 's/^.*=//' *
1xxx_DSAFDSAFDSFA=FDAFDSAFDSAFSDA=12341243142 renamed as 12341243142
# now rename all files
$ rename 's/^.*=//' *
*
와일드카드를 기반으로 하는 파일(예: 모든 파일 또는 *.txt
모든 텍스트 파일)에서 쉽게 작동할 수 있고 모든 Perl 정규식을 허용하므로 매우 유연한 도구입니다 .
답변3
awk
이 장소도 저장할 수 있습니다. 나는 그것을 사용하고 있습니다. 원하는 경우 cp
다음과 같이 변경하십시오.mv
ls | awk -F"=" '{system("cp -i "$0" "$3)}'
안전을 위해 -i
매개변수로도 사용하겠습니다.cp