Почему используется своп, когда много памяти все еще свободна? [дубликат]

На основе Ответ Рахула :

$ ls -ltr | grep -v '^d' | awk 'NR==2 {print $NF; exit}' | xargs -I '{}' mv -- '{}' ../complete/

Примечания:

  • Вы говорите, что хотите что-то сделать с «самым старым файлом» . Все ответы предполагают, что вы имеете в виду наименее недавно измененные. Если вы имеете в виду, что изменено не так давно , так и скажите; ответы будут немного другими. Если вы имеете в виду, что недавно создал , то, что вы хотите, в Unix практически невозможно.
  • ls -lt (что использовал Рахул) перечисляет текущий каталог в длинном формате в порядке по дате / времени изменения, с самым новым первым и самым старым последним. ls -ltr - это r , противоположное этому; сначала старые, а последние - самые новые.
  • Если у вас могут быть файлы, имена которых начинаются с точки (. ), добавьте параметр A в ls ; например, ls-ltrA . (Порядок параметров не имеет значения; вы можете использовать ls-ltAr , ls-lAtr или даже ls -ltr-A , если хотите.)
  • Я солгал. В длинном ls листинге каталога всегда сначала идет строка total . В ls -ltr самая старая запись находится во второй строке .
  • grep -v '^ d' отфильтровывает каталоги (если есть).
  • awk 'NR == 2 {print $ NF; exit} ' печатает последнее поле (имя файла *) из второй строки (самый старый файл), а затем завершает работу.

    • Это на один процесс меньше, чем хвост -1 | awk '{print $ NF}' .
    • Это может сработать быстрее, потому что при выходе из awk , ls также может выйти, и вы избежите создания списка для всего каталога.
    • Вы можете удалить grep , выполнив

       ls -ltr | awk '! / ^ d / {count ++} count == 2 {print $ NF; exit} '
       

      , но я бы не советовал. Слишком сложные скрипты сложно поддерживать.

  • - после mv в xargs команде необходимо , если у вас есть имена файлов, начинающиеся с - .
  • Вам действительно не нужны xargs . Вы можете упростить приведенную выше команду до

     $ mv - $ (ls -ltr | grep -v '^ d' | awk 'NR == 2 {print $ NF; exit}') .. / complete / 
     

________
* Как и в случае с ответом Рахула, это не сработает, если имя файла содержит пробелы или табуляцию (и) - и даже хуже, если оно содержит новую строку ( с).

Если у вас могут быть файлы, имена которых начинаются с точки (. ), выполните shopt -s dotglob перед выполнением

$ mv -- * ../error/

7
04.04.2014, 23:52
0 ответов

Теги

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