*.mkv, *.avi, *.mp4를 재귀적으로 검색하여 동일한 이름의 빈 파일로 바꾸는 방법

*.mkv, *.avi, *.mp4를 재귀적으로 검색하여 동일한 이름의 빈 파일로 바꾸는 방법

CentOS와 bash에서 작동하도록 해보세요:

  1. mp4, mkv, avi를 모두 재귀적으로 검색합니다.
  2. 해당 파일을 삭제하고 같은 이름의 빈 파일로 교체하세요.

답변1

파일을 찾으려면 를 사용합니다 find. 파일을 자르려면 을 사용합니다 truncate. 또한 xargs호출을 자주 사용합니다 truncate. 그러나 -exec.findxargs

그래서 이와 같은 것이 작동해야합니다. (테스트되지 않음)

find . \( -iname '*.mkv' -o -iname '*.avi' -o -iname '*.mp4' \) -print0 | xargs -0 echo truncate -s 0

echo올바른 명령과 올바른 파일 이름이 출력되는지 테스트한 후 삭제합니다.

답변2

globstarbash 옵션을 사용하여 glob 문자를 활성화 할 수 있습니다 **.

globstar
    If set, the pattern ** used in a pathname expansion con‐
    text will match all files and zero or  more  directories
    and  subdirectories.  If the pattern is followed by a /,
    only directories and subdirectories match.

이렇게 하면 **/*.mkv이름을 재귀적으로 검색 할 수 있습니다 .mkv. 다음으로, 원본 파일을 삭제하고 새 파일을 만드는 것으로 생각하지 마세요. 원본 파일을 지우기만 하면 됩니다. 가장 간단한 방법은 입니다 > file. 그러면 쓰기용 파일이 열리고 이미 존재하는 모든 내용을 덮어쓰게 됩니다. 실제로 아무것도 작성하지 않으므로 빈 파일이 생성됩니다.

이를 염두에 두고 다음 예를 고려하십시오.

$ tree -h
.
├── [4.0K]  dir1
│   ├── [4.0K]  subdir1
│   │   ├── [ 48K]  file.mp3
│   │   └── [ 53M]  file.mp4
│   └── [4.0K]  subdir2
│       └── [136M]  file2.avi
├── [4.0K]  dir2
│   ├── [399K]  file.mkv
│   └── [4.0K]  subdir1
│       └── [548M]  file3.avi
└── [ 30M]  file.avi

5 directories, 6 files

6개의 파일이 있으며 그 중 5개는 찾고 있는 패턴과 일치합니다( dir1/subdir1/file.mp3변경해서는 안 됨). 제공한 패턴과 일치하는 파일을 비우려면 다음을 수행하면 됩니다.

$ shopt -s globstar 
$ for f in **/*.mp4 **/*.avi **/*.mkv; do > "$f"; done

지금 다시 실행 하면 파일 하나만 빼고 모두 지워진 tree것을 볼 수 있습니다 .mp3

$ tree -h
.
├── [4.0K]  dir1
│   ├── [4.0K]  subdir1
│   │   ├── [ 48K]  file.mp3
│   │   └── [   0]  file.mp4
│   └── [4.0K]  subdir2
│       └── [   0]  file2.avi
├── [4.0K]  dir2
│   ├── [   0]  file.mkv
│   └── [4.0K]  subdir1
│       └── [   0]  file3.avi
└── [   0]  file.avi

또는 제안된 대로 ctrl-alt-delor를 사용할 수 있지만 둘 중 하나도 find필요하지 않습니다 . 다음을 수행하세요.xargs-print0

find . \( -name '*.mkv' -o -name '*.avi' -o -name '*.mp4' \) -exec sh -c ' > "$1"' mysh {} \;

관련 정보