Как обрабатывать результаты поиска в bash script?
Я пытаюсь использовать массив для хранения списка имен файлов с помощью команды find
.
По какой-то причине массив не работает в bash, который используется в школе, но моя программа работает на моем собственном ноутбуке.
Итак, мне было интересно, есть ли другой способ сделать это, вот что у меня есть:
array = (`find . -name "*.txt"`) #this will store all the .txt files into the array
Затем я могу получить доступ к элементам массива и сделать копии всех файлов с помощью команды cat.
Есть ли другой способ сделать это без использования массива?
Ответы
Ответ 1
Вы можете использовать что-то вроде этого:
find . -name '*.txt' | while read line; do
echo "Processing file '$line'"
done
например. сделайте копию:
find . -name '*.txt' | while read line; do
echo "Copying '$line' to /tmp"
cp -- "$line" /tmp
done
НТН
Ответ 2
У меня возникла проблема с решением Johannes Weiß, если бы я просто выполнял эхо, это сработало бы для полного списка файлов. Однако, если я попытался запустить ffmpeg на следующей строке, script обработает только первый файл, с которым он столкнулся. Я предположил некоторые смешные дела IFS из-за трубы, но я не мог понять это и вместо этого работал с циклом for:
for i in $(find . -name '*.mov' );
do
echo "$i"
done
Ответ 3
Просто не помещайте пробелы вокруг знака равенства:
ar=($(find . -name "*.txt"))
Избегайте обратных ссылок, если это возможно, поскольку они устарели. Их можно легко спутать с апострофом, особенно в бедных шрифтах, и они не так хорошо гнездятся.
В большинстве случаев вам будет лучше всего обслуживать, если вы выполните итерацию через результат поиска непосредственно с помощью -exec, -execdir, -ok или -okdir.
Для циклов while и while это трудно сделать правильно, когда дело доходит до пробелов в именах файлов или новых строк и вкладок.
find ./ -name "*.txt" -exec grep {} ";"
{} не требуется маскировка.
Вы часто увидите комбинацию find/xargs, которая также запускает дополнительный процесс:
find ./ -name "*.txt" | xargs grep {} ";"
Ответ 4
find . -name '*.txt' | while IFS= read -r FILE; do
echo "Copying $FILE.."
cp "$FILE" /destination
done