음, 파일 이름에서 큰따옴표를 제거하고 싶습니다. 다음은 내가 생각해낸 명령입니다(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
데 사용되지 않습니다 .tr
mv
답변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
. 그런 다음 두 디렉터리 중 하나를 삭제하기 전에 두 디렉터리 모두에 문제가 없는지 확인할 수 있습니다. 를 포함하지 않는 것을 제외하면 결국 거의 동일한 디렉터리입니다 "
.