Замена команды, держащая ls вывод, вызывает ошибку

Я не вижу, почему Вы перешли ко всей проблеме для изменения исходного кода ядра для добавления поддержки этого нестандартного последовательного порта I/O и IRQ. setserial(8) программа должна смочь настроить его для Вас. Что-то вроде этого:

# setserial ttyS4 address 0x10 irq 9

См. Linux Последовательное ПРАКТИЧЕСКОЕ РУКОВОДСТВО для получения дополнительной информации.

1
10.05.2015, 11:12
4 ответа

Ваш путь

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

$ tar -zcvf DB-Backup-17082012.tgz $(ls -lrth|grep "Aug 17"|awk '{print $9}')

Это избавится от всех других данных столбца, которые Вы получаете от ls -lrth и просто дайте Вам имена файлов.

Используя находку и tar: метод № 1

Можно использовать Unix find команда для получения списка всех файлов, которые были в последний раз изменены в данную дату и передают этот список по каналу к tar следующим образом:

$ find . -type f -newermt 2012-08-17 ! -newermt 2012-08-18 -print0 | \
   xargs -0 tar zcvf DB-Backup-17082012.tgz

Вышеупомянутое только найдет файлы, которые были в последний раз изменены 17.08.2012, но ничто более новое. -print0 говорит находят для разделения файлов, что это производит нулевые символы использования (\0) и xargs -0 берет каждый из этих файлов и создает вызовы tar добавление файлов в пакетах за один раз.

Это - вероятно, наименее производительный способ сделать это.

Примечание: Этот метод также рискует терять файлы, если Ваш имеют больше, чем можно передать как параметры командной строки tar команда.

Используя находку и tar: метод № 2

-print0 и xargs -0 избыточны, и можно использовать просто find генерировать список и вызов tar непосредственно:

$ find . -type f -newermt 2012-08-17 ! -newermt 2012-08-18 \
   -exec tar zcvf DB-Backup-17082012.tgz {} \+

{} \+ аргументы для нахождения выше сделают 2 вещи. {} заменит названием каждого файла как find находит его в этом положении при вызове tar и \+ говорит find продолжать помещать столько файлов, сколько это может на командной строке перед вызовом tar. Это сохраняет Вас при необходимости вызвать tar 100 раз, если у Вас есть 100 файлов для добавления к нему.

Ссылки

3
27.01.2020, 23:11
  • 1
    я надеюсь, что Вы понимаете это, если Вы "xargs tar" и командная строка становитесь слишком длинными tar будет запущен многократно, и только последняя версия сохраняется. Количество символов является большим (100K или так), но я видел xargs вызовите его команды многократно в реальной жизни. –  Anthon 27.06.2013, 00:12
  • 2
    @Anthon - Спасибо я добавлю разъяснение. –  slm♦ 27.06.2013, 00:20
  • 3
    @Anthon В эти дни предел по умолчанию на Linux составляет 2 МБ (это были 128 КБ в течение долгого времени). Это снижает риск на практике, но не устраняет его. –  Gilles 'SO- stop being evil' 27.06.2013, 02:36
  • 4
    @Gilles - делают Вы, оказывается, знаете если \+ опция пострадала бы от той же проблемы затем? –  slm♦ 27.06.2013, 02:41
  • 5
    Помимо странного заключения в кавычки в grep "Aug 17"|awk '{print $9'}, обратите внимание также, что это эквивалентно awk '/Aug 17/{print $9}'. См. также partmaps.org/era/unix/award.html#grep –  tripleee 27.06.2013, 08:28

Если Вы делаете $(ls -lrth|grep "Aug 17") Вы получаете целую строку, не только имена файлов как аргумент tar, таким образом, это не будет работать. В целом Вы не должны анализировать вывод ls.

То, что можно сделать, если у Вас есть относительно последняя версия Гну, находят (> = v4.3.3)

find . -maxdepth 1 -newermt 20120817T0000 -not -newermt 20130818T0000 -print0 \
    | cpio --create --null  --format=ustar \
    | gzip > DB-Backup-17082012.tgz

Если Ваш find не поддерживает -newermt можно создать два файла с касанием с теми метками времени даты и просто использовать - более новый. Конечно, можно также использовать -daystart -mtime но необходимо было бы вычислить количество дней (или метод проб и ошибок использования).

Одна рекомендация, которую я имею, состоит в том, чтобы использовать даты в файлах в форме YYYYMMDD. Сначала вида, более хорошего, если у Вас есть несколько файлов, которые запускаются с той же строки до даты и второй, что-то как 05062012 было бы неоднозначно в зависимости от человека, смотрящего на имя файла (5-го июня (Европа) или 6-го мая (США)). Таким образом, хотя 1708 должен быть 17-го августа, я назвал бы файл DB-Backup-20120817.tgz

7
27.01.2020, 23:11

Ваш текущий формат ls|grep "Aug 17" ничего не производит. Вместо этого используйте следующий формат:

$ ls -ltr  | grep 'Aug 17'
0
27.01.2020, 23:11
  • 1
    О, извините это был ls-lrth, я скопировал неправильную команду. Вопрос обновляется –  OmiPenguin 26.06.2013, 17:19

относительно $(ls -lrth|grep "Aug 17") эта awk строка, вероятно, извлекла бы даты, которые Вы хотите:

$(ls -lrth|awk '/Aug/&&/17{print $0}')
0
27.01.2020, 23:11
  • 1
    Необходимо указать, что это только работает на ограниченный список обеспеченных имен файлов. В целом вывод ls не может быть обработан (имена файлов могли бы содержать пробелы и/или новые строки и т.д.) –  Anthon 26.06.2013, 21:22
  • 2
    ах Ваше право, хотя в данном случае это работает (который имеет меня подвергающий сомнению downvote...) –  jrnetclueless 26.06.2013, 23:35
  • 3
    Если Вы отвечаете на что-то на SX, необходимо, по моему скромному мнению, заботиться для указания, где ограничения. Кто-то еще мог бы придумать аналогичную ситуацию, но не так файлы хорошего поведения и не поймет, почему она действительно работает на него. (Это не был я, который downvoted, таким образом, кто-то еще должен думать Ваш ответ, не так полезен). –  Anthon 27.06.2013, 00:05
  • 4
    я приношу извинения, я должен был добавить, что не думал, что это были Вы, которые downvoted меня, так как Ваш комментарий не казался абсолютно отрицательным. Так или иначе я - полный новичок когда дело доходит до этого материала, таким образом, любая обратная связь приветствуется –  jrnetclueless 27.06.2013, 00:12

Теги

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