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

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

어떤 방법이 있나요?그냥 find 명령을 사용하세요파일 이름 앞에 문자열을 추가하시겠습니까?

그래서:

201a.txt
201b.png
...

다음과 같이 됩니다:

foo_201a.txt
foo_201b.png
...

이것:

find . -name '201*' -execdir mv {} foo_{} \;

{}해당 부분에 파일 이름 앞에 선행 문자가 포함되어 있으므로 ./작동 하지 않으므로 foo_./201*.

찾기만 사용하여 이 작업을 수행할 수 없는 경우 파일 이름에 문자열을 추가하는 가장 이식 가능한(읽기: 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에 의해 제공되며 coreutilsxargs의해 제공되므로 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##*/}"' {} \;

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

관련 정보