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

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

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

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

答案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

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

或者,您可以find按照 ctrl-alt-delor 的建议使用,但不需要xargs-print0任何一个。只需执行以下操作:

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

相关内容