find, xargs 및 mv: 큰따옴표를 사용하여 파일 이름 바꾸기, 확장명 및 bash 우선순위 문제

find, xargs 및 mv: 큰따옴표를 사용하여 파일 이름 바꾸기, 확장명 및 bash 우선순위 문제

음, 파일 이름에서 큰따옴표를 제거하고 싶습니다. 다음은 내가 생각해낸 명령입니다(bash).

$ find . -iname "*\"*" -print0 | xargs -0 -I {} mv {} {} | tr -d \"

문제는 'mv {} {} | tr -d \"'부품에 있습니다. 나는 그것이 우선순위 문제라고 생각한다: bash는 로 해석되는 것 같고 (mv {} {}) | tr -d \"), 나에게 남은 것은 큰따옴표가 제거된 파일 이름뿐이다. 분명히 이것은 파일 이름을 바꿀 수 없기 때문에 내가 원하는 것이 아닙니다. 대신, 다음과 같이 첫 번째 파일 이름에 따옴표가 포함되고 두 번째 파일 이름에 따옴표가 포함되지 않기를 원합니다 mv {} ({} | tr -d \").

이 목표를 어떻게 달성할 수 있나요? 대괄호와 중괄호를 사용해 보았지만 명령 실행 우선순위를 명시적으로 설정할 때 무엇을 하는지 잘 모르겠습니다.

답변1

이것이 설치 되어 있다고 가정하고 rename다음을 사용하십시오.

find . -name '*"*' -exec rename 's/"//g' {} +

rename명령은 Perl표현식을 사용하여 새 이름을 생성합니다. s/"//g이름의 전역 대체를 수행하여 모든 따옴표를 빈 문자열로 바꿉니다.

이렇게 하려면 mv하위 명령을 실행할 수 있도록 쉘 명령으로 파이프해야 합니다.

find . -name '*"*' -exec sh -c 'mv "$0" "$(printf %s "$0" | tr -d "\"")"' {} \;

xargs당신이 작성한 것은 to 의 출력을 파이프로 사용하며 to 의 인수를 구성하는 tr데 사용되지 않습니다 .trmv

답변2

xargs -0 -I {} mv {} {} | tr -d \"

의미 없음: mv출력을 생성하지 않습니다. 따라서 를 사용할 수 없습니다 mv.

find . -name '*"*' -exec bash -c 'mv "$1" "${1//\"/}"' bash {} \;

또는 더 적은 오버헤드로

find . -name '*"*' -exec bash -c 'for file in "$@"; do mv "$file" "${file//\"/}"; done' bash {} +

답변3

당신은 할 수도 있습니다 ...

mkdir ../_cp
pax -Xwrl -s'/"//gp' . "${PWD%/*}/_cp"

.이렇게 하면 를 가리키는 여러 지점이 생성됩니다 ../_cp. 그런 다음 두 디렉터리 중 하나를 삭제하기 전에 두 디렉터리 모두에 문제가 없는지 확인할 수 있습니다. 를 포함하지 않는 것을 제외하면 결국 거의 동일한 디렉터리입니다 ".

관련 정보