要查找文件,请使用find
. 要截断文件,请使用truncate
. 我也习惯于xargs
呼吁truncate
. 但是,您可以使用 的-exec
选项find
来避免使用xargs
.
所以这样的事情应该有效。(未经测试)
find . \( -iname '*.mkv' -o -iname '*.avi' -o -iname '*.mp4' \) -print0 | xargs -0 echo truncate -s 0
删除echo
后测试它输出正确的命令,具有正确的文件名。
您可以使用globstar
启用**
glob 字符的 bash 选项:
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.
Run Code Online (Sandbox Code Playgroud)
有了它,您可以使用**/*.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
Run Code Online (Sandbox Code Playgroud)
我们有 6 个文件,其中 5 个与您要查找的模式匹配(dir1/subdir1/file.mp3
不应更改)。要清空与您提供的模式匹配的文件,您只需执行以下操作:
$ shopt -s globstar
$ for f in **/*.mp4 **/*.avi **/*.mkv; do > "$f"; done
Run Code Online (Sandbox Code Playgroud)
如果我们现在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
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用find
ctrl-alt-delor 建议的那样,但不需要xargs
或-print0
或任何一个。简单地做:
find . \( -name '*.mkv' -o -name '*.avi' -o -name '*.mp4' \) -exec sh -c ' > "$1"' mysh {} \;
Run Code Online (Sandbox Code Playgroud)