이것은 숙제입니다!
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
하면 실제로 어떤 조치도 취하지 않고 인쇄물(근사치)을 얻을 수 있습니다.