Find는 훌륭한 유틸리티이며 매우 다재다능합니다. 기존 파일 이름에 접미사 또는 접두사를 추가하여 파일 이름을 바꾸려고 합니다. 시원한.
find -name "*" -exec mv {} {}.yo \;
이제 이해가 안되는 부분이군요 -위 작업을 취소해야 하는 경우 어떻게 해야 합니까?
편집하다 -
접두어를 붙일 수 없다는 것을 알았습니다. 이 문제를 해결할 수 있는 방법이 있습니까?
find -type f -name "*" -exec mv {} yu.{} \;
mv: cannot move './o.txt.yu.yu' to 'yu../o.txt.yu.yu': No such file or directory
답변1
find . -depth -name '*.yo' -exec sh -c '
ret=0
for file do
mv -i -- "$file" "${file%.yo}" || ret=$?
done
exit "$ret"' sh {} +
file.yo
그러면 접미사를 추가하는 데 사용한 명령과 같은 디렉터리를 포함하여 모든 유형의 파일 이름 이 없이 로 .yo
변경 됩니다 . 첫 번째 이름 으로 이름을 바꾼 다음 해당 이름으로 바꾸면 더 이상 존재하지 않기 때문에 작동하지 않습니다 .file
.yo
dir.yo
dir
dir.yo/file.yo
dir.yo/file
dir.yo
-depth
거의 항상 일괄 이름 바꾸기를 사용하는 것이 더 좋으므로 항상 사용하는 것이 좋습니다. 기억해야 할 유일한 점은 -prune
.
포함하는 디렉터리 구성 요소에 대한 전체 경로를 사용하기 때문에 접두사를 사용하는 것은 mv {} prefix{}
작동하지 않는 {}
반면, 파일 이름에 접두사를 추가하려면 다음과 같은 것이 필요합니다.
find . -depth -type f -exec sh -c '
ret=0
for file do
dir=${file%/*} name=${file##*/}
mv -i -- "$file" "$dir/yu.$name" || ret=$?
done
exit "$ret"' sh {} +
이번에는 -type f
이름을 바꾸는 데 사용합니다.정기적인다음을 포함한 다른 모든 유형의 파일을 제외한 파일목차,선입선출,장비,심볼릭 링크, 등.
mmv
zsh
이러한 작업을 수동으로 수행하는 대신 Or's 와 같은 전용 일괄 이름 바꾸기 도구를 사용하는 것이 좋습니다 zmv
.
존재하다 zsh
:
autoload -Uz zmv
zmv '(**/)(*).yo(#qD)' '$1$2' # remove .yo suffix
zmv '(**/)(*)(#qD.)' '${1}yu.$2' # add yu. prefix to regular files
(#q...)
이다글로벌 예선여기서 D
zmv는 find
기본적으로 숨겨진 파일이나 숨겨진 디렉터리의 파일도 고려하도록 지시하며 s .
와 동일합니다 .find
-type f
답변2
트위스트:
find -name "*" -exec mv {} {}.yo \;
간단한 접근 방식은 다음과 같습니다.
먼저 "unyo.bash" 스크립트를 만듭니다.
#!/usr/bin/env bash
for name in "$@"; do
mv "$name" "${name%.yo}"
done
그런 다음 이를 사용하여 파일을 취소합니다.
find -name "*.yo" -print0 | xargs -0 /path/to/unyo.bash
"print0" 및 "xargs -0"이 없으면 하나씩 실행해야 할 수도 있습니다(매번 bash가 생성되므로 비효율적입니다).
find -name "*.yo" -exec /path/to/unyo.bash '{}' \;
답변3
yu../
해당 파일이나 디렉터리가 없습니다.
이 시도
find * -type f -exec echo {} pref_{} \;
*
Asterisk는 dir을 제외한 현재 디렉터리의 모든 파일로 확장됩니다.
이 옵션을 사용하는 하위 디렉터리가 있으면 -prune
해당 하위 디렉터리로 드릴다운되지 않습니다.
이런 구조도 있어요
find -type f -exec bash -c 'echo $0 ${0%%/*}/pref_${0##*/}' {} \;
그러나 그 안에서 위치 변수는 $0, 즉 {$0 $1 $2 ...} +
또는에 있는 모든 파일 부터 카운트다운을 시작합니다.{$0} \;
따라서 파일 수는 다음과 같이 계산할 수 있습니다.
find -type f -exec bash -c 'echo $#' 1 {} +
이와 같은 모든 파일을 표시할 수 있습니다.
find -type f -exec bash -c 'echo $@' 1 {} +
여기에서는 공백 대신 공백 없이 문자나 단어를 사용할 수 있습니다. 이는 $0 변수에 또 다른 추가 파일이 있음을 의미합니다.
답변4
이제 제가 이해할 수 없는 부분이 있습니다. 위의 내용을 실행 취소해야 하는 경우 어떻게 해야 합니까?
다음 명령을 사용할 수 있습니다.
for FILENAME in `find . -name "*.yo"`; do mv "$FILENAME" $(echo "$FILENAME" | sed -e 's/\.[^.]*$//'); done