LINUX.ORG.RU

Удалить все текстовые файлы без find

 


0

1

Здравствуйте.

Студент. Сдаю лабу по UNIX.

Задание:

Удалить все текстовые файлы из заданного каталога

Я не долго думая, сую ему этот код:

find /DIR -name "*.txt" | xargs rm

А он говорит, что не нужен мне find, делай мол циклы. Хотя про это в задании не сказано.

Я вот набросал:

if test "$1" 
	then
        
        cd "$1";

        ТУТ ЦИКЛ, в котором мы идем по всем файлам

            if  имя файла == *.txt
        	rm его (удаляем его)
            fi

        КОНЕЦ ЦИКЛА
        
    else
  		echo Usage: noparam
fi

Можете русский язык перевсти на BASH, пожалуйста.

Перемещено beastie из general

Ответ на: комментарий от entefeed
while rm /DIR/*.txt 2>/dev/null; do echo "Удаляю ..."; done && echo "Все, удалил!"

:)

anTaRes ★★★★
()
Ответ на: комментарий от beastie

Ого. Спасибо, конечно, но это сильно заумно.

Все файлы в ASCII удалять не стоит.

Нужно по маске *.txt

SWAROVSKI
() автор топика
Ответ на: комментарий от SWAROVSKI

Скучный студент нынче пошёл.
Это задание как про барометр и башню, надо выполнить максимальным количеством неправильных, но формально работающи хспособов.
Например, простейший ls *.txt | xargs rm -f. А в качестве тяжёлой артиллерии можно и тот старый перловый однострочник откопать...

Deleted
()
Ответ на: комментарий от GoNaX

Предлагал такой вариант.

Ровно как и

rm -r /dir/*.txt 

Не прокатило...

SWAROVSKI
() автор топика

for i in `ls *.txt`; do rm ${i}; done

anonymous
()

Твой препод - глупец. Если он хочет циклы - то пусть ставит нормальное задание. А удалять файлы через жопу - можно, но зачем?

Chaser_Andrey ★★★★★
()

А он говорит, что не нужен мне find, делай мол циклы

Расскажи где ты учишься, очень уж интересно.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Если лабы по знанию SHELL'a, то препод правильно просит сделать все средствами SHELL, а не coreutils

Это учеба, здесь не всегда нужен самый короткий/быстрый способ решения, здесь нужно показать знания.

anonymous
()
Ответ на: комментарий от anonymous

препод правильно просит сделать все средствами SHELL, а не coreutils

И как средствами шела удалить файл? rm не предлагать - это coreutils.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Я думал ты умнее чем кажешься, а так-то trollius vulgaris

anonymous
()

Я уже отметился в соседнем треде, отмечусь и в этом. ;)

ТС, передай своему преподу, от моего имени, что он идиот.

Твоё первое решение — единственно верное, а все эти пляски с «только на bash» — ни уму, ни сердцу.

beastie ★★★★★
()
Ответ на: комментарий от beastie

Учитывая, что он сдает ЦИКЛЫ в конце семестра, я принимаю сторону препода и считаю, что ленивых прогульщиков надо опускать идиотскими заданиями просто ради того, чтоб они хоть разок напряглись.

cdshines ★★★★★
()
Ответ на: комментарий от kawaii_neko

Для начинающего и лабы вполне себе правильное решение. ;) Пробелы — это уже levelUp.

Для всех других:

# linux style
find . -iname '*.txt' -type f -delete
# bsd style
find . -iname '*.txt' -type f -print0 | xargs -r0 rm
beastie ★★★★★
()
Ответ на: комментарий от Chaser_Andrey

А удалять файлы через жопу - можно, но зачем?

Ну он хочет научить студентов циклам, а не удалению файлов.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

Ну он хочет научить студентов патчу Бармина.

FFGJ

beastie ★★★★★
()
Ответ на: комментарий от proud_anon

«*.txt»

Все еще думаешь что текстовые файлы это файлы с суффиксом расширением txt? Я тебя огорчу.

anonymous
()
Ответ на: комментарий от beastie

Ну ладно, я не заметил, что там UNIX.

Зато и у решения с xargs есть проблема: если в имени файла встречается \n, что допустимо по POSIX, то он не удалится, а могут удалиться другие файлы. А find -print0 и xargs -0 в POSIX нету. Поэтому преподаватель, наверное, прав, что настаивает на циклах.

proud_anon ★★★★★
()
Ответ на: комментарий от beastie

Серьезно, когда я сдавал лабы (как правило, или раньше, или в срок), никто не выносил мозг тупыми вещами. Наоборот, если ты что-то сделал попроще, без велосипедов, это было хорошо. А кто сдавал потом скопом лентяев под конец сессии, те ходили и ныли, что у них сложные и бессмысленные вопросы. Я гарантирую, что ТС из этой когорты. Хотя бы по тому признаку, что нагуглить «bash loops» быстрее, чем запостить тред на лоре, но ведь лень же :)

cdshines ★★★★★
()
Ответ на: комментарий от beastie

Задача: удалить все текстовые файлы из заданного каталога

Тестовые данные

beastie_lounge:~ # file fake.txt
fake.txt: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), stripped


beastie_lounge:~ # file pingofdeath.c
pingofdeath.c: ASCII C program text


давай зачётку, хотя не давай

zolden ★★★★★
()
Ответ на: комментарий от zolden

Глянь на самый первый пост. Там я в полу-шутку упомянул 'file'.

Т.ч., товарищь экзаминатор — вам на повышение классификации. И без зачётки не возвращайся. ;)

beastie ★★★★★
()

Наиболее энтерпрайзный вариант

#!/bin/bash

function files() {
  ls -1 $1 | while read file; do echo "$1/$file"; done;
}

function is_directory() {
  [[ -d $1 ]];
}

function is_txt() {
  [[ $1 =~ ^.*\.txt$ ]];
}

function each() {
  for file in `$1 $3`; do
    if is_directory $file; then
      each files in $file;
    elif is_txt $file; then
      echo $file;
    fi;
  done;
}

each files in .

но яб на месте препода спалил по стилю кода

Deleted
()
Ответ на: комментарий от no-such-file

вот сколько не пытался ни разу не находил как в баше вменяемо (через stream api, или xpath) работать с xml

Deleted
()
Ответ на: комментарий от beastie

Вы способны на большее, Дмитрий, просто вы ленивый, как и все студенты

beastie_lounge:~/zachot # ls -a
.  ..  .profile
beastie_lounge:~/zachot # file -b .profile
ASCII text
beastie_lounge:~/zachot # for i in *;do [[ "$(file -b $i)" =~ "text" ]] && echo rm "$i";done
beastie_lounge:~/zachot #


Приходите после армии

zolden ★★★★★
()
Ответ на: комментарий от cdshines

Не знаю, но задачи явно даже без намёка на какое-либо практическое применение и учебную ценность.

Прогульщиков так не вдохновить. (А ведь это — главная задача препода — вдохновлять, а не заваливать.)

beastie ★★★★★
()
Ответ на: комментарий от beastie

Хм...ну хорошо...что бы вас ещё такого спросить...
А, вот. Взнос на банкет для преподавателей уже сделали?

zolden ★★★★★
()
Ответ на: комментарий от zolden

«А может вам кровь из вены?» ©

Если не помнишь этот старый, бородатый медицинский анекдот, то вот от:

Врачь спрашивает у пациента: «Вы кровь из пальца сдавали?» (Делая при этом характарный жест пальцами — мол, где деньги?)
Пациент отвечает: «А может вам из вены?» (Делая при этом тоже характерный жест, прикладывая ребро одной ладони к внутренней соторне локтя другой руки — мол, иш, разогнался!)
«Ну, лечитесь, лечитесь», отвечает врачь. (Показывая фигу.)

beastie ★★★★★
()
Ответ на: комментарий от anonymous

Нет, ну вы решили меня совсем завалить вышими corner-case'ами. ;)

for i in .[^.]* ..?* *; do [[ "`file -b -- \"$i\"`" =~ "text" ]] && echo rm -- "$i"; done
beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 2)

Каждый, кто предлагает что-то типа ls DIR/*.txt не прав. Это не будет работать, если файлов более 2^16.
Тебе нужно что-то типа:

DIR=/path/to/files
test -d "$DIR" && ls $DIR/ | while read f; do [ $f ~= \.txt$ ] && rm -f "$f"; done

AnDoR ★★★★★
()
Ответ на: комментарий от anonymous

echo /dev/zero > f

И ты, наверно имел в виду 'touch'. ;)

$ echo /dev/zero > empty
$ file empty
empty: ASCII text
$ cat empty
/dev/zero
$ rm empty

vs.

$ touch emtpy
$ file empty
empty: empty
$ cat empty
$ rm empty
beastie ★★★★★
()
Ответ на: комментарий от beastie

Прогульщиков так не вдохновить. (А ведь это — главная задача препода — вдохновлять, а не заваливать.)

Идиотов надо отчислять. А то корочки уже все подряд выдают.

Dudraug ★★★★★
()

вот вам еще бреда в ленту:

for file in ....
    mount -o bind /dev/random $file;
done
или
for file in ....
    trash=~/.local/share/Trash;
    mkdir -p $trash/info/ $trash/files/;

    touch $trash/info/$file.trashinfo;
    echo '[Trash Info]' > $trash/info/$file.trashinfo;
    echo 'Path='DIR/$file >> $trash/info/$file.trashinfo;
    echo 'DeletionDate='$(date +%Y-%m-%dT%X) >> $trash/info/$file.trashinfo;

    mv DIR/$file $trash/files/;
done
;)

anTaRes ★★★★
()

Пропустил про каталог. Тогда grep добавить.

barberry ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.