명령줄의 파일을 특정 문자열로 바꾸기

명령줄의 파일을 특정 문자열로 바꾸기

(디스크 전체에서) 한 파일을 다른 파일(둘 다 동일한 경로에 있음)로 검색하고(일치하는 경우) 바꿔야 합니다.

예:

  Folder 1
    x*.txt (good) (e.g.: xFile.txt)
    *.txt (bad) (e.g.: File.txt)

동일한 경로에 있는 두 파일이 일치하면 :를 제거 *.txt (e.g.: File.txt)하고 :의 이름을 다음 x*.txt (e.g.: xFile.txt)으로 바꿔야 합니다.*.txt (e.g.: File.txt)

결과:

 Folder 1
  *.txt (e.g: File.txt... old xFile.txt)

나는 다음 명령을 사용합니다.

find -name 'x*.txt' | sed -r 'p;s/g([^\/]*.txt)/\1/' | xargs -d '\n' -n2 mv

문제는 명령을 실행하기 전에 명령이 두 파일이 모두 존재하는지(xFile.txt와 File.txt가 동일한 경로에 있음) 확인하지 않는다는 것입니다.

어떻게 해결할 수 있나요? 미리 감사드립니다

답변1

GNU 도구를 사용하면 다음을 수행할 수 있습니다.

(export LC_ALL=C
  find . -name '*.txt' -print0 |
  sed -Ez 's|/x([^/]*)$|/\1|' |
  sort -z |
  uniq -zd |
  sed -z 'h;s|.*/|&x|;G' |
  xargs -r0n2 echo mv)

이름이 여러 개로 시작하는 파일이 없다고 가정합니다 x. 예를 들어, 그러면 안 돼요mv ./xx.txt ./x.txt

답변2

먼저 작업을 수행하는 함수를 정의합니다.

switcheroo() {
    [[ -f x"$1" ]] && mv -f x"$1" "$1"
}
export -f switcheroo

이제 우리는 find버림받은 사람들을 반복하기 위해 몇 가지 어둠의 마법을 사용합니다.

find . -name \*.txt -execdir bash -c 'switcheroo "$0"' "{}" \;

우리는 이를 사용하여 확장자가 있는 find모든 .txt파일을 찾은 다음(원하는 기준에 맞게 구체화할 수 있음) switcheroo 프로세스를 통해 해당 파일을 실행합니다. 이 프로세스를 사용하여 [[ ... ]]대체 파일이 존재하는지 테스트하고, 그렇다면 mv대체 파일을 구현합니다. .

관련 정보