Проблема у вас есть то, что вы передаете сценарий с помощью стандартного ввода, но сам скрипт пытается читать из стандартного ввода. Чтобы передать параметры сценарию, переданному на стандартный ввод, я бы рекомендовал использовать аргументы командной строки, возможно, с чтением из стандартного ввода во внешнем цикле, если оно вам все еще нужно.
Проблема второго порядка в том, что ваш синтаксис для вызова read
неверен. (Требуется имя переменной без $
.) Кроме того, вы хотите передать -r
в read
, иначе он будет делать неприятные и неожиданные вещи если ввод содержит обратную косую черту.
Проблема третьего порядка заключается в том, что вы выполняете для i в $ (cat servers.txt)
, а вместо этого хотите
для
цикл не только читает весь файл в память (что, возможно, взорвать на больших файлах), он терпит неудачу, когда отдельные линии имеют пробелы в них.
Conzsh
:
echo rm -f./**/*pattern*(.Dom[4,-1])
**/
cualquier nivel de subdirectorios (...)
calificadores globales para calificar el partido en otros criterios:.
:solo archivos regulares D
:incluir puntos -archivos (archivos ocultos )y buscar en directorios ocultos om
:ordenar por hora de modificación (del más reciente al más antiguo)[4,-1]
:del 4 al al último (, por lo que se salta los primeros 3 ). (eliminar echo
para hacerlo realmente)
Para un equivalente usando cualquier shell POSIX y utilidades GNU:
(export LC_ALL=C
find. -name '*pattern*' -type f -printf '%T@/%p\0' |
sort -zrn |
tail -zn +4 |
cut -zd/ -f2- |
xargs -r0 echo rm -f)
(eliminar echo
para hacerlo realmente)
Con versiones anteriores de las utilidades GNU, es posible que necesite:
(export LC_ALL=C
find. -name '*pattern*' -type f -printf '%T@/%p\0' |
tr '\n\0' '\0\n' |
sort -rn |
tail -n +4 |
cut -d/ -f2- |
tr '\n\0' '\0\n' |
xargs -r0 echo rm -f)
bueno, la clasificación requiere una lógica a su alrededor, pero hasta ahora:
# Create an array with the files you want to target FILES=$(find ${PATH_TO_FOLDER} -type f -name "whatever.whatever") # Get the total size of the array totalSize=${#FILES[@]} # Detract 3 from total size to create a threshold stopat=((${totalSize}-3)) # Declare a counter at 0 counter=0 # iterate file by file in the array for FILE in "${FILES[@]}" do # make sure that you do this until 3 files are left while [ ${counter} -le ${stopat} ] do rm -v ${FILE} ((counter++)) done done
cuando usa -name
puede usar expresiones extendidas, p. *.sh
o hello*.sh
o *hello.sh
etc
Tenga en cuenta que el comando anterior eliminará todos los archivos menos 3, use el comando sort
para ordenar los archivos como desee (ya sea usando el tamaño, la fecha de creación o modificación )aquí:
FILES=$(find ${PATH_TO_FOLDER} -type f -name "whatever.whatever")