CentOS와 bash에서 작동하도록 해보세요:
- mp4, mkv, avi를 모두 재귀적으로 검색합니다.
- 해당 파일을 삭제하고 같은 이름의 빈 파일로 교체하세요.
답변1
파일을 찾으려면 를 사용합니다 find
. 파일을 자르려면 을 사용합니다 truncate
. 또한 xargs
호출을 자주 사용합니다 truncate
. 그러나 -exec
.find
xargs
그래서 이와 같은 것이 작동해야합니다. (테스트되지 않음)
find . \( -iname '*.mkv' -o -iname '*.avi' -o -iname '*.mp4' \) -print0 | xargs -0 echo truncate -s 0
echo
올바른 명령과 올바른 파일 이름이 출력되는지 테스트한 후 삭제합니다.
답변2
globstar
bash 옵션을 사용하여 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 {} \;