2015-04-10 2 views
-1

Я хочу добавить имя файла, удаленное из rm -rf *.log, в другой файл, скажем xyz.abc. Есть ли способ сделать это?добавить вывод rm -rf в файл

Он должен добавить все файлы .log в xyz.abc. Пробовал, но не смог, поэтому прошу здесь.

+0

Если 'ет -rf' не выделяет этот список файлов в качестве вывода, тогда вы запрашиваете что-то другое, чем «добавление вывода rm -rf». Не могли бы вы понять, как выглядят результаты? Является ли намерение чем-то понятным для человека?Недвусмысленно машинный синтаксический анализ (в этом случае список имен файлов должен быть NUL-ограниченным или с оболочкой)? Что-то другое? –

+0

Вот как мой вывод должен выглядеть. У меня есть 3 файлов журнала, 1.log 2.log 3.log Я подаю гт -rf * .log И я хочу файл NAMD xyz.abc, который будет создан, который хранит 1.log 2.log – mbBlogging

+0

Всякий раз, когда файлы удаляются с помощью 'rm' из этого экземпляра/скрипта в консоли? Всякий раз, когда файлы удаляются любым способом любым процессом в системе? Вам нужен «xyz.abc» для каждого каталога (поскольку вы показываете имена файлов без имен каталогов в вашем примере)? Один глобально с полными путями? –

ответ

0

Команда rm -rf *.log не печатает никаких выходных данных; он молча удаляет указанные файлы.

Опция -r, вероятно, не имеет особого смысла в этом случае и потенциально может быть опасным. Если вы пытаетесь удалить все *.log файлы в текущем каталоге, все, что вам нужно, это

rm -f *.log 

В -r значение только если у вас есть один или несколько каталогов, чьи имена заканчиваются на .log; он затем рекурсивно удалит эти каталоги и все их содержимое.

Предполагая, что вы просто хотите, чтобы удалить все *.log файлов в текущем каталоге и добавить их имена xyz.abc, вот как я бы это сделать:

for file in *.log ; do 
    echo "$file" >> xyz.abc 
    rm -f "$file" 
done 
+0

Спасибо, это работает. – mbBlogging

1

Самый простой способ - написать небольшой скрипт, который сделает это за вас, и использовать его вместо реальной программы rm. Таким образом, вы могли бы написать что-то вроде этого и сохранить его, как, скажем, $HOME/RemoveLogs

#!/bin/bash 
find . -maxdepth 1 -name \*.log -print -exec rm {} +; >> xyz.abc 

Затем в терминале, введите следующую команду только один раз, чтобы сделать скрипт исполняемым

chmod +x $HOME/RemoveLogs 

, а затем, когда вы чтобы удалить журналы, просто запустите

$HOME/RemoveLogs 

в качестве альтернативы, вы можете просто ввести команду find выше непосредственно в терминале, если у вас есть AG ООД память и как вводить :-)

+0

Ответ обновлен, пожалуйста, взгляните еще раз. –

+0

Зачем запускать 'find', затем' rm'? Вы дважды попадаете в файловую систему (предоставлено, кэш-память direntry обычно содержит содержимое между ними), а не только один раз хранит результаты glob и дважды используется для записи в файл, один раз для создания списка аргументов для 'rm '. –

+0

(Кроме того, поскольку вы не останавливаете 'find' от рекурсии,' find' может отображать больше файлов в этом прецеденте, чем 'rm', а затем удаляет). –

0

Учитывая случай использования разъяснен в комментарии - что вы не пытаетесь войти все использования в rm, но конкретный экземпляр, как вызывается из процесса сборки (или хрон работа уборка после указанного процесса сборки):

printf '%s\n' *.log >>deletedFiles 
rm -f -- *.log 

Обратите внимание, что это не будет различать файл с именем bar$'\n'foo и двух файлов с именем bar и foo; оба будут регистрироваться с двумя последовательными линиями. Для этого вам нужно использовать либо '%q\n' (если ваша оболочка bash) или %s\0 для вашей строки формата; первый будет генерировать ваш журнал в безопасной форме (довольно легко для людей, чтобы читать, трудно разобрать безопасно из оболочки); последний будет производить его в форме, ограниченной NUL (трудно для людей читать, легко анализировать машиной на любом языке); либо является однозначным во всех возможных именах файлов.

+0

У меня будет попытка и будет обновляться, если это работает. :) Спасибо. – mbBlogging