파일로 가득 찬 디렉토리가 있습니다. *.py와 일치하는 모든 파일의 이름을 -backup.py로 바꾸고 싶습니다. 어떻게 해야 하나요?
*.py에서 i를 사용할 수 있다는 것을 알고 있지만 초기 이름을 유지하고 모든 이름에 백업을 추가하는 방법을 잘 모르겠습니다.
답변1
for i in *.py
do
mv "$i" `echo "$i" | sed 's/\.py$/-backup.py/'`
done
답변2
사악한 수프와 동일 find
:
find . -name '*.py' -exec bash -c 'mv "$1" "${1%.py}-backup.py"' _ {} \;
또는 인스턴스를 시작하고 싶지 않은 경우세게 때리다발견된 각 파일에 대해 다음을 수행합니다.
find . -name '*.py' -exec bash -c 'for f; do mv "$f" "${f%.py}-backup.py"; done' _ {} +
find
파일이 많으면 이 솔루션이 더 나을 수 있습니다.세게 때리다와일드카드는 느립니다. -n
옵션 mv
(스포일러 없음) 또는 -v
옵션(상세)을 자유롭게 추가하세요 .
답변3
본질은 unxnut의 답변과 동일하지만 sed를 사용하여 확장 기능을 제거하는 것만 큼 간단한 작업을 수행하는 것은 과잉이라고 생각합니다.
for f in ./*.py; do mv "$f" "${f%.py}-backup.py"; done
${f%.py}
변수 $f는 .py
끝에서 삭제되었습니다. 삭제를 사용하여 처음부터 시작할 수도 있습니다 ${f#whatever}
. 재귀성을 위해(즉, 현재 디렉터리와 모든 하위 디렉터리에서 작업) bash 4+가 있다고 가정하면 globstar를 사용할 수 있습니다.
shopt -s globstar
for f in ./**/*.py; do mv "$f" "${f%.py}-backup.py"; done
또는 이름 바꾸기를 사용할 수 있습니다. 실제로 이 이름을 사용하는 두 가지 다른 프로그램이 있으며, 어떤 프로그램을 사용하는지는 *nix 버전에 따라 다릅니다. perl-rename (Debian 및 Ubuntu 등과 같은 파생 제품에서 사용됨):
rename 's/\.py$/-rename.py/' ./*.py
또 다른 이름 바꾸기는 다음 구문을 사용합니다.
rename .py -backup.py ./*.py
for
물론 루프는 mv
이식성이 더 좋습니다. 최초의 비재귀 루프는 POSIX이므로 일부 박물관 자료를 제외한 모든 *nix에서 작동합니다.