디렉토리에 있는 모든 파일 이름의 문자 바꾸기

디렉토리에 있는 모든 파일 이름의 문자 바꾸기

이것은 숙제입니다!

yay파일 이름의 모든 공백을 디렉토리의 밑줄로 바꾸려고 합니다 . $(command)를 사용하지 않고 xargs 및 sh 명령을 사용해야 합니다. 명령줄을 사용해 보았으나 계속해서 다음 메시지가 표시됩니다.

sh: 1: Bad substitution

이 메시지가 계속 나타나는 이유를 설명할 수 있는 사람이 있습니까?

내가 사용하는 데 지친 명령은 다음과 같습니다.

find yay -type f -print0 | xargs -0 -I {} sh -c 'newname="${1// /_}"; mv "$1" "$newname"' sh

그리고

find yay -type f -exec sh -c 'mv "$1" "${1// /_}"' _ {} \;

답변1

쉘은 대체를 sh이해하지 못합니다 /. ( 그러나 %and 는 이해합니다 #.) 다음과 같은 쉘이 필요합니다 bash.

find yay -type f -exec bash -c 'mv -- "$1" "${1// /_}"' _ {} \;

셸 호출 수(현재 파일당 한 번)를 줄이고 대상이 아직 존재하지 않는 경우에만 파일 이름을 바꾸면 이를 보다 효율적으로 작성할 수 있습니다.

find yay -type f -name '* *' -exec bash -c 'for f in "$@"; do g=${f// /_}; [ ! -e "$g" ] && mv -f -- "$f" "$g"; done' _ {} +

테스트할 때 mv접두사를 추가 echo하면 실제로 어떤 조치도 취하지 않고 인쇄물(근사치)을 얻을 수 있습니다.

관련 정보