방법이 있나요?find 명령만으로파일 이름 앞에 문자열을 추가하려면?
그래서 이것은:
201a.txt
201b.png
...
다음과 같이 됩니다:
foo_201a.txt
foo_201b.png
...
이것:
find . -name '201*' -execdir mv {} foo_{} \;
{}
해당 부분에 파일 이름 앞 부분이 포함되어 있으므로 ./
에 쓰려고 하기 때문에 작동하지 않습니다 foo_./201*
.
find만으로 가능하지 않은 경우 파일 이름 앞에 문자열을 추가하는 가장 이식성 있는(읽기: coreutils만, 쉘 스크립트 없음, 이해하기 가장 쉬운) 방법은 무엇입니까?
답변1
아니요. 하지만 이 rename
명령은 간단한 솔루션을 제공합니다.
$ ls -1
201a.txt
201b.png
$ rename 201 foo_201 201*
$ ls -1
foo_201a.txt
foo_201b.png
$
답변2
어때?
find . -name '201*' -execdir basename {} \; | xargs -I{} mv {} foo_{}
basename
에 의해 제공 되고 제공되기 coreutils
때문에 적어도 그 자체만큼 이식성이 있어야 합니다.xargs
findutils
find -execdir
또는 POSIX 셸 기능만 사용
find . -name '201*' -execdir sh -c 'mv "$1" "foo_${1#*/}"' sh {} \;
답변3
find
GNU find만으로는 불가능합니다 . GNU find는 -printf foo_%p
대신 을 사용하여 명령줄 접두사를 제거하고 대신 다른 접두사를 추가하여 파일을 인쇄할 수 있지만 -print
와 비슷한 것은 없습니다 -exec
.
find -printf 'mv foo_%p …' | sh
( 위험하게 살고 싶다면 를 사용할 수 있습니다 . 이는 "길들인" 파일 이름에만 작동하며 파일 이름에 공백, 따옴표 및 기타 특수 문자가 있는 경우 심각하게 중단됩니다. 따라서 이 작업을 수행하지 마십시오.)
이를 수행하는 표준 방법(모든 POSIX 시스템에서 작동하는 방식 및 일반적인 방식)은 문자열 조작을 수행하기 위해 쉘을 호출하는 것입니다.
find . -name '201*' -exec sh -c 'mv -- "$0" "${0%/*}/foo_${0##*/}"' {} \;
-execdir
GNU 확장이고 이식성을 요구했기 때문에 사용하지 않습니다 . 은 {}
인수로 셸에 전달됩니다. 쉘 코드 내부에서는 절대 사용하지 마십시오 {}
. 이식성이 없기 때문일 뿐만 아니라 가장 중요한 것은 파일 이름이 쉘 코드로 해석되어 파일 이름에 특수 문자가 포함되어 있으면 실패하기 때문입니다.
최신 POSIX 시스템(지난 10년 동안의 시스템)에서는 쉘 호출을 일괄 처리하여 이 명령 속도를 약간 높일 수 있습니다.
find . -name '201*' -exec sh -c 'for x do mv -- "$x" "${x%/*}/foo_${x##*/}"; done' sh {} +
또는 ksh, bash 또는 zsh에서 find
.
set -o globstar # ksh only
shopt -s globstar # bash only
for x in **/201*; do
mv -- "$x" "${x%/*}/foo_${x##*/}"
done
답변4
*
부품 을 제거하는 대신 별표( )를 사용할 수 있습니다 ./
.
find * -name '201*' -exec mv {} foo_{} \;