Найти выходные данные команды для сортировки, а затем удалить

Проблема у вас есть то, что вы передаете сценарий с помощью стандартного ввода, но сам скрипт пытается читать из стандартного ввода. Чтобы передать параметры сценарию, переданному на стандартный ввод, я бы рекомендовал использовать аргументы командной строки, возможно, с чтением из стандартного ввода во внешнем цикле, если оно вам все еще нужно.

Проблема второго порядка в том, что ваш синтаксис для вызова read неверен. (Требуется имя переменной без $ .) Кроме того, вы хотите передать -r в read , иначе он будет делать неприятные и неожиданные вещи если ввод содержит обратную косую черту.

Проблема третьего порядка заключается в том, что вы выполняете для i в $ (cat servers.txt) , а вместо этого хотите . Это идет линейно; кнопку для цикл не только читает весь файл в память (что, возможно, взорвать на больших файлах), он терпит неудачу, когда отдельные линии имеют пробелы в них.

2
18.05.2018, 14:10
2 ответа

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 echopara 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 echopara 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)
3
27.01.2020, 22:09

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 -namepuede usar expresiones extendidas, p. *.sho hello*.sho *hello.shetc

Tenga en cuenta que el comando anterior eliminará todos los archivos menos 3, use el comando sortpara 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")

-1
27.01.2020, 22:09

Теги

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