Как на bash написать скрипт, поиска и копирования файлов?
Приветствую!
Есть файл filename123.txt мне нужно поискать по 500 каталогам filename123.exe, и если такой файл существует, то скопировать его к filename123.txt
теперь допустим у меня есть каталог, в котором:
filename123.txt.
filenameAD.txt
...
1filename.txt
B мне по каждому нужно сделать такой поиск. можно подсказки, как это можно сделать?
Предполагаю, что раз вы задаете такой вопрос - вы недостаточно хорошо знакомы с возможностями команды find. Предлагаю вам не просто хелп по этой команде, а целый сервис, для тех кто еще не выучил наизусть параметры.
#!/bin/bah
for i in `ls /dir/wit/.txt/files | sed 's/\.txt//g'`
do
find /search/root -iname "$i.*" -exec rm {} \; -print
done
К примеру, так.
Где /dir/wit/.txt/files - директория, которая содержит файлы типа filename123.txt.
/search/root - корень дерева из 500 директорий.
Данная команда выполняет удаление всех найденных файлов по заданной вами маске (не совсем понял ваше "то скопировать его к filename123.txt" ). Далее команду find можно перестроить под ваши нужды, удачи!
@homelessness о, спасибо)
только удалять не нужно.
Нужно чтоб filename123.txt и filename123.exe лежали в одном каталоге.
Спасибо, сейчас попробую подправить под свои нужды.
@homelessness
#!/bin/bash
for i in `ls /path/to/txt/ | sed 's/\.txt//g'`
do
find /path/to/exe/ -iname "$i.*" -exec cp {} /path/to/txt/ \; -print
done
вот примерно такое нужно было!
сердечно благодарю!
@homelessness а можно ещё подсказочку?
как заставить скрип искать рекурсивно во всех каталогах файлы.
сейчас он ищет файлы только
for i in `ls /path/to/txt/ | sed 's/\.txt//g'`
#!/bin/bash
for i in `find /path/to/root/txt/ -iname "*.txt" | sed 's/[0-9A-Za-z]*\.txt//g'`
do
for j in `ls $i | grep txt | sed 's/\.txt//g'`
do
find /path/to/root/exe/ -iname "$j.exe" -exec cp {} $i \;
done
done
Скрипт расчитан на то что в именах .txt не будет небуквенно-циферных символов. !только! Буквы или цифры. Если есть еще всякие там тирешки и прочее - допиливайте sed, чтобы он их исключал тоже.
не, не поймет точно. Избавляйтесь от этого: плохая практика. Если будут пробелы - то все файнды будут воспринимать то что было до пробела, и после пробела - как два разных параметра.
@m00nkey Тогда пробуйте заключать все, где могут быть пробелы в двойные кавычки. У себя уже пробовать не буду, времени нет:
#!/bin/bash
for i in `find "/path/to/root/txt/" -iname "*.txt" | sed 's/[0-9A-Za-z]*\.txt//g'`
do
for j in `ls "$i" | grep txt | sed 's/\.txt//g'`
do
find "/path/to/root/exe/" -iname "$j.exe" -exec cp {} "$i" \;
done
done
Ну вообщем то не очень знаю как с пробелами бороться.
Может, есть возможность изменить алгоритм, генерирующий файлы чтобы исключить пробелы, а с существующими - просто переименовать их?
всё-таки просто find не поможет.
У меня есть 2 каталога. в одном *txt много файлов
в другом просто очень много разных файлов.
Мне необходимо сделать следущее:
берём имя первого файла из первого каталога: например filename123.txt
и нужно найти во втором каталоге и всех подкаталогах файл filename123.exe и положить его рядом с filename123.txt.
после чего я беру второй файл из первого каталога.... итак далее