Пара решений.
Выберите последний аргумент командной строки.
args=( "$@" )
num=${args[-1]}
args=( "${args[@]:0:${#args[@]} - 1}" )
(затем используйте find "${args[@]}" -type f -mtime "+$num" -print -delete
для удаления этих файлов ).
Сначала поставьте число.
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
Опция -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
или одна из многих других вариаций на ту же тему.