尝试让它在 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
或者,您可以find
按照 ctrl-alt-delor 的建议使用,但不需要xargs
或-print0
任何一个。只需执行以下操作:
find . \( -name '*.mkv' -o -name '*.avi' -o -name '*.mp4' \) -exec sh -c ' > "$1"' mysh {} \;