Я искал фрагмент кода для размещения в .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 '{}' \;`
Что здесь не очень понятно, так это то, что у вас не может быть файла и каталога с одинаковым именем. Кроме того, поскольку вы упоминаете распаковку 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 / подкаталоги в несжатом виде.
Если вы хотите найти все каталоги 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 {})'
объяснение:
Создайте скрипт оболочки следующим образом:
#!/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
.