*.mkv、*.avi、*.mp4を再帰的に検索して、同じ名前の空のファイルに置き換える方法

*.mkv、*.avi、*.mp4を再帰的に検索して、同じ名前の空のファイルに置き換える方法

CentOSとbashで動作するようにしてください:

  1. mp4、mkv、aviをすべて再帰的に検索します。
  2. そのファイルを削除し、同じ名前の空のファイルと置き換えます。

答え1

ファイルを検索するにはを使用しますfind。ファイルを切り取るにはを使用しますtruncate。また、xargs呼び出しを頻繁に使用しますtruncate。しかし、-execfindxargs

だから、このようなことがうまくいくはずです。 (テストされていません)

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

今すぐやり直すと、1つのファイルだけを除いてすべて消去された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 {} \;

関連情報