Удаление каталога с именем файла

Я искал фрагмент кода для размещения в .sh, который удаляет каталог с именем файла.

Под этим я подразумеваю, что я хотел бы указать каталог, а затем найти его в списке файлов типа «.XXX», а затем удалить все подкаталоги (с содержимым) с тем же именем.

Псевдокод того, что я хочу сделать:

find names all files of type .XXX within a directory
find and remove all subdirectories with names that equal the file names found

Как лучше всего это сделать? Я искал функцию поиска, которую я буду использовать перед этой функцией для разархивирования архивов:

`find . -name "*.rar" -exec unrar x '{}' \;`
2
задан 16 July 2012 в 00:23

3 ответа

Что здесь не очень понятно, так это то, что у вас не может быть файла и каталога с одинаковым именем. Кроме того, поскольку вы упоминаете распаковку rar-файлов, можно подумать, что вы хотите удалить каталог, названный в честь rar-файла. Это странно, потому что, почему вы хотите удалить его после того, как распакуете его?

На основании моего плохого понимания проблемы (которое может улучшиться, если вы проясните или, еще лучше, приведите пример), это может работа:

for i in *rar; do
    (cd uncompressed && rm -rf $i)
done

, поэтому, если у вас есть что-то вроде

./file1.rar
./file2.rar
./file3.rar
./uncompressed/file1.rar/...
./uncompressed/file2.rar/...
./uncompressed/file3.rar/...

, мини-скрипт, который я разместил, должен удалить все файлы * .rar / подкаталоги в несжатом виде.

0
ответ дан 16 July 2012 в 00:23

Если вы хотите найти все каталоги d, там d содержит файл d.xyz. Тогда это найдет каталоги для вас.

find . -type d -print0 |
xargs -0 --replace={} --max-args=1 bash -c 'find {} -maxdepth 1 -name $(basename {}).xyz -print0' |
xargs -0 --replace={}  bash -c 'echo $(dirname {})'

объяснение:

  1. найти все файлы каталога типа, которые являются потомками текущего рабочего каталога
  2. , то для каждого каталога d (и строго по одному на время), у которого есть прямые дети, которого зовут d.xyz
  3. распечатать имя каталога
0
ответ дан 16 July 2012 в 00:23

Создайте скрипт оболочки следующим образом:

#!/bin/bash
rm -rf $(dirname $1)/$(basename $1 .$2)

И используйте следующее для поиска файлов и удаления каталогов:

find . -name "*.XXX" -exec /path/to/script {} XXX \;

Замените XXX расширением, которое вы хотите найти.

Что делает скрипт:

  • Первый параметр - это путь к файлу.
  • Второй параметр - это расширение, которое вы ищете.
  • dirname получает путь и возвращает каталог, в котором находится файл.
  • basename получает путь, возвращает имя файла и при необходимости удаляет суффикс, в данном случае расширение.

find передает скрипту путь к поиску сжатого файла и поиску расширения, например, /path/to/script /home/user/test/file1.rar rar. [Тысяча сто двадцать одна]

dirname $1 расширяется до dirname /home/user/test/file1.rar, который возвращает /home/user/test, basename $1 расширяется до basename /home/user/test/file1.rar rar, который возвращает file1. Собрав все воедино, скрипт выполняет rm -rf /home/user/test/file1.

0
ответ дан 16 July 2012 в 00:23

Другие вопросы по тегам:

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