find 명령을 사용하여 파일 이름을 반대로 변경하시겠습니까?

find 명령을 사용하여 파일 이름을 반대로 변경하시겠습니까?

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.yodir.yodirdir.yo/file.yodir.yo/filedir.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이름을 바꾸는 데 사용합니다.정기적인다음을 포함한 다른 모든 유형의 파일을 제외한 파일목차,선입선출,장비,심볼릭 링크, 등.

mmvzsh이러한 작업을 수동으로 수행하는 대신 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...)이다글로벌 예선여기서 Dzmv는 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

관련 정보