Как рекурсивно искать *.mkv, *.avi, *.mp4 и заменять пустым файлом с таким же именем

Вы можете использовать терминал в режиме vim. Если вы наберете в консоли терминала set -o viРаскладка клавиатуры терминала теперь переключается в режим vim.

другой способ :копировать/вырезать буфер обмена мышью вставить в терминал

CTRL+SHIFT+V

2
28.10.2020, 19:50
2 ответа

Чтобы найти файлы, используйте find. Чтобы обрезать файл, используйте truncate. Я также использую xargs, чтобы обратиться к truncate. Однако вы можете использовать опцию -execдля find, чтобы избежать использования xargs.

Что-то вроде этого должно работать. (не проверено)

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

Удалите echoпосле проверки правильности вывода команд с правильными именами файлов -.

7
18.03.2021, 22:54

Вы можете использовать параметр globstarbash, который включает символ **глобуса:

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 -del or, но нет необходимости в xargsили -print0или что-то в этом роде. Просто сделайте:

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

Теги

Похожие вопросы