디렉토리 이름을 기준으로 파일 이름 바꾸기

디렉토리 이름을 기준으로 파일 이름 바꾸기
for i in L*;
do
cd $i
find . -type f -name 'botrytis_cinerea_T12345.*' -exec rename 's/botrytis_cinerea_T12345/"$i"/g' {} \;
done

오류가 발생했습니다.

find: missing argument to `-exec' rename: not enough arguments

Usage:  rename [options] expression replacement file...

Options:  -v, --verbose    explain what is being done  -s, --symlink   act on symlink target

 -h, --help     display this help and exit  -V, --version  output version information and exit

For more details see rename(1).

답변1

rename구문이 다른 두 가지 공통 명령이 있습니다 . Perl 표현식을 허용하는 버전용으로 작성된 스크립트를 사용하고 있습니다.

rename s/expression/replacement/g file...

그러나 설치한 버전은 정규식과 대체 문자열을 모두 허용하는 버전입니다. 표시되는 오류 메시지는 다음과 같습니다.

rename [options] expression replacement file...

\;( 대신 사용한 운이 좋거나 똑똑하다고 생각하세요 .) 명령을 +조정하여 find이 문제를 해결할 수 있습니다.

find . -type f -name 'botrytis_cinerea_T12345.*' -exec rename botrytis_cinerea_T12345 "$i" {} \;

Kusalananda가 주석에서 지적했듯이 cd루프 내부에도 있지만 원래 디렉터리로 돌아오지 않으므로 첫 번째 반복 이후의 모든 반복에서는 cd존재하지 않는 디렉터리에 반복적으로 액세스하려고 합니다. cd그 후에 다른 작업을 수행하여 이 문제를 해결 하려고 할 수도 있지만 find아마도 나 자신을 조정하여 이 문제를 피하려고 할 것입니다 find.

for i in L*; do
    find "$i" -type f -name 'botrytis_cinerea_T12345.*' -exec rename botrytis_cinerea_T12345 "$i" {} \;
done

당신은 또한 볼 수 있습니다

답변2

작은따옴표는 확장을 중지합니다. {}를 이스케이프해야 할 수도 있습니다. 대신 다음을 수행하세요.

find . -type f -name 'botrytis_cinerea_T12345.*' -exec rename "s/botrytis_cinerea_T12345/$i/g" \{\} \;

관련 정보