find 명령을 사용하여 파일 이름 앞에 추가

find 명령을 사용하여 파일 이름 앞에 추가

방법이 있나요?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때문에 적어도 그 자체만큼 이식성이 있어야 합니다.xargsfindutilsfind -execdir


또는 POSIX 셸 기능만 사용

find . -name '201*' -execdir sh -c 'mv "$1" "foo_${1#*/}"' sh {} \;

답변3

findGNU 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##*/}"' {} \;

-execdirGNU 확장이고 이식성을 요구했기 때문에 사용하지 않습니다 . 은 {}인수로 셸에 전달됩니다. 쉘 코드 내부에서는 절대 사용하지 마십시오 {}. 이식성이 없기 때문일 뿐만 아니라 가장 중요한 것은 파일 이름이 쉘 코드로 해석되어 파일 이름에 특수 문자가 포함되어 있으면 실패하기 때문입니다.

최신 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_{} \;  

관련 정보