如何递归搜索*.mkv、*.avi、*.mp4并替换为同名空文件

Mar*_*eim 2 bash files

试图让它在 CentOS 和 bash 中工作:

  1. 递归搜索所有 mp4、mkv、avi
  2. 删除该文件并替换为同名的空文件

ctr*_*lor 7

要查找文件,请使用find. 要截断文件,请使用truncate. 我也习惯于xargs呼吁truncate. 但是,您可以使用 的-exec选项find来避免使用xargs.

所以这样的事情应该有效。(未经测试)

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

删除echo后测试它输出正确的命令,具有正确的文件名。


ter*_*don 6

您可以使用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)

或者,您可以使用findctrl-alt-delor 建议的那样,但不需要xargs-print0或任何一个。简单地做:

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

  • @RomanOdaisky 不确定 zsh 是否具有高级功能或表情符号。 (3认同)