Bash Script - Использование Basename для вывода в файл - PullRequest
1 голос
/ 10 февраля 2011

Я создал небольшой скрипт для проверки получения базового имени всех файлов в текущем каталоге.Я хочу вывести их все в файл output.txt, но, используя цикл for, конечно, файл просто перезаписывается каждый раз.Используя следующий код, как я могу изменить его, чтобы просто добавить каждый в конец файла (просто)?

#!/bin/bash

files=$(find -size +100)

for f in $files; do
    basename "$f" > output.txt
done

exit

Ответы [ 6 ]

3 голосов
/ 10 февраля 2011

Воспользуйтесь предложением MrAfs и переместите перенаправление в конец цикла.Используя > вместо >>, вам не нужно явно обрезать файл.

Также используйте цикл while read, чтобы он работал, если в именах файлов есть пробелы.exit в конце является избыточным.

#!/bin/bash

find -size +100 | while read -r f
do
    basename "$f"
done > output.txt

В некоторых случаях вы можете избежать создания подоболочки.Вы можете использовать процесс подстановки:

#!/bin/bash

while read -r f
do
    basename "$f"
done < <(find -size +100) > output.txt

или в следующем Bash 4.2:

#!/bin/bash

shopt -s lastpipe    
find -size +100 | while read -r f
do
    basename "$f"
done > output.txt
3 голосов
/ 10 февраля 2011

Или вкладыш:

find -size +100 -exec basename "{}" \; >> output
2 голосов
/ 10 февраля 2011

Вы можете перенаправить конструкции bash

#!/bin/bash

files=$(find -size +100)

for f in $files; do
    basename "$f" 
done > output.txt

exit
2 голосов
/ 10 февраля 2011

Вы должны использовать >> для добавления к файлу вместо >.

1 голос
/ 10 февраля 2011

Без вызова базового имени:


find -size +100 -printf "%f\n" > output.txt
1 голос
/ 10 февраля 2011

Вы можете сделать это:

rm -f output.txt
for f in $files; do
    basename "$f" >> output.txt
done

Или это:

for f in $files; do
    basename "$f"
done > output.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...