С find
и bash
#!/usr/bin/env bash
while IFS= read -r file; do
file=${file%/*}
echo mv -v "${file%/*}" /home/rwo/Desktop/TO
done < <(find main -type f -name 'log.txt')
echo
нужен, чтобы показать вам, что произойдет, удалите его, если вы считаете, что результат в порядке.
Простая симуляция
mkdir -p Main/folder{1..3}
mkdir -p Main/folder1/subfolder
mkdir -p Main/folder2/subfolder2
mkdir -p Main/folder3/subfolder3
touch Main/folder3/subfolder3/log.txt
Создайте целевой каталог
mkdir -p home/rwo/Desktop/TO
проверьте, что находится внутри основного каталога.
tree Main
Вывод
Main
├── folder1
│ └── subfolder
├── folder2
│ └── subfolder2
└── folder3
└── subfolder3
└── log.txt
6 directories, 1 file
Теперь скрипт соответствует Main
#!/usr/bin/env bash
while IFS= read -r file; do
file=${file%/*}
echo mv -v "${file%/*}" home/rwo/Desktop/TO
done < <(find Main -type f -name 'log.txt')
output
mv -v Main/folder3/ home/rwo/Desktop/TO
Удаление echo
приведет к выводу
renamed 'Main/folder3/' -> 'home/rwo/Desktop/TO/folder3'
The "${file%/*}"
- это форма Parameter Expansion Что в основном удаляет последний /
Так, например, вывод find main -type f -name 'log.txt'
main/folder3/subfolder3/log.txt
Удаление последнего /
с расширением параметра останется только имя пути
main/folder3/subfolder3/
Применить другое расширение параметра для удаления последнего /
приведет к
main/folder3/
Затем отправьте его на mv
как аргумент внутри while read
l oop.
<()
называется Подстановка процесса
IFS=
отключает функция по умолчанию встроенной read
, которая удаляет конечные и начальные пробелы.
Посмотрите как читать файл или поток в bash, чтобы понять while read
l oop, что опубликовано.