Linux :Объединение команд

Пара решений.

  1. Выберите последний аргумент командной строки.

    args=( "$@" )
    num=${args[-1]}
    args=( "${args[@]:0:${#args[@]} - 1}" )
    

    (затем используйте find "${args[@]}" -type f -mtime "+$num" -print -deleteдля удаления этих файлов ).

  2. Сначала поставьте число.

     num=$1; shift
    

    (, затем используйте find "$@" -type f -mtime "+$num" -print -deleteдля удаления файлов ).

Цикл нужен только в том случае, если у вас есть сотни или тысячи каталогов для обработки, и в этом случае команда findбудет слишком длинной при одном вызове. В противном случае не зацикливайтесь. findможет использовать несколько путей поиска.

Если вы хотите вставить задержку и явно использовать rmи иметь форматированный вывод для каждого файла:

find "$@" -type f -mtime "+$num" -exec sh -c '
    for pathname do
        printf "Removing %s\n" "$pathname"
        rm -- "$pathname"
        sleep 1
    done' sh {} +

Если вы обнаружите, что вам действительно нужно перебирать каталоги (или если вам так удобнее):

# Assumes that the arguments are in the order
#      num dir1 dir2 dir3...

num=$1
shift

for dir do
    printf 'Processing %s...\n' "$dir"

    find "$dir" -type f -mtime "+$num" -exec sh -c '
        for pathname do
            printf "Removing %s\n" "$pathname"
            rm -- "$pathname"
            sleep 1
        done' sh {} +
done

или,

# Assumes that the arguments are in the order
#      dir1 dir2 dir3... num

args=( "$@" )
num=${args[-1]}
args=( "${args[@]:0:${#args[@]} - 1}" )

for dir in "${args[@]}"; do

    # as above

done
0
10.03.2021, 13:52
1 ответ

Опция -oдля GNU grepзаставит утилиту возвращать только те подстроки, которые соответствуют выражению. Ваше выражение [y], то же самое, что просто y. Это означает, что grepвернет список из yсимволов (и Y, так как вы используете сопоставление без учета регистра с-i).

Кроме того, у вас есть синтаксическая ошибка в конце конвейера. Последнего символа |там быть не должно. Вместо этого перенаправление должно быть из sortнапрямую (или заменено параметром -o newfileи аргументом параметра -наsort).

Вы ничего не сказали о содержимом файла names, поэтому я собираюсь предположить , что это файл, содержащий имена, по одному в строке.

Чтобы получить все строки, содержащие буквуy(без учета регистра ), вы можете использовать

grep '[yY]' names

или

grep -i 'y' names

Затем вы можете отсортировать их в обратном порядке, снова игнорируя регистр (, хотя большинство имен, я полагаю, в любом случае начинаются с буквы верхнего -регистра ), используя sort -f -r, как вы сделали:

grep '[yY]' names | sort -f -r -o newfile

или

grep '[yY]' names | sort -f -r >newfile

В этом конкретном случае порядок команд не имеет большого значения.

sort -f -r names | grep '[yY]' >newfile

Можно даже написать как

( sort -f -r | grep '[yY]' ) <names >newfile

или

<names ( grep '[yY]' | sort -f -r ) >newfile

или одна из многих других вариаций на ту же тему.

4
18.03.2021, 22:26

Теги

Похожие вопросы