Как другие пользователи уже очень подробно объяснили, для специальных файлов требуется код для их резервного копирования. Однако, похоже, никто не упомянул, что Linux предоставляет несколько способов написания этого кода в пользовательском пространстве:
A. FUSE (файловая система в USErspace) позволяет вам написать что-то вроде / proc
без риска сбоя ядра и сделать это на любом языке / среде выполнения по вашему выбору, например Go , Node.js , Perl , PHP , Python , Ruby , Rust , и т. Д. .
Это также имеет то преимущество, что файловые системы FUSE можно монтировать без sudo
, потому что они запускаются от имени пользователя, выполняющего монтирование.
Вот несколько примеров того, что люди написали с помощью FUSE:
B. Если вы хотите создать виртуальное устройство ввода, такое как клавиатура, мышь, джойстик и т. Д. (Например,чтобы написать драйвер пользовательского пространства для USB-устройства, с которым вы разговариваете, используя libusb
), есть uinput .
Привязки для него труднее найти, но я знаю, что они существуют для Go (только клавиатура), Python и Ruby (2) .
Примеры использования uinput в реальном мире:
С. Для обычных символьных устройств существует CUSE (Символьные устройства в USErspace). Однако это гораздо менее популярно.
Единственный пользователь CUSE API, о котором я лично знаю, - это та же программа, которая побудила его создать: osspd , который реализует / dev / dsp
, / dev / adsp
и / dev / Mixer
(API аудио OSS) в пользовательском пространстве, чтобы их можно было маршрутизировать через PulseAudio или dmix.
Единственное связывание CUSE, которое мне удалось найти, это cusepy , которое не обновлялось с 2010 года.
D. Вам может вообще не понадобиться новый специальный файл.
Например, вы можете установить прямую связь с любым USB-устройством, используя libusb (список привязок на странице), а затем общаться с другими программами через какой-либо другой механизм (сокеты TCP / UDP, чтение / запись stdin / stdout или обычных файлов на диск и т. д.).
Вы можете сделать что-то вроде этого:
#!/bin/bash
cd folder
ls -l --time-style=long-iso | awk '{print $8 " " $6}' | while IFS= read line; do
filename=$(echo $line | awk '{print $1}')
date=$(echo $line | awk '{print $2}')
mv ${filename} ${filename}_${date}
done
stat
доступен? Попробуйте
stat -c"mv %n %n_%y" file* | sed 's/ [^ ]* [^ ]*$//'
mv file file_2018-10-04
mv file~ file~_2018-09-30
mv file1 file1_2018-10-05
mv file1~ file1~_2018-10-04
и передать через sh
, если вас устраивает результат. Или получить его с помощью «замены процесса».
Предполагая, что "созданный" означаетmtime
1 и (ab )с использованием Perl -на основеrename
:
$ rename -n 'BEGIN{use POSIX;} $_.= strftime("_%x", localtime( (stat($_))[9] ))' file?
rename(file1, file1_2018-09-23)
rename(file2, file2_2018-09-15)
rename(file3, file3_2018-10-01)
rename(file4, file4_2018-09-15)
rename(file5, file5_2018-10-06)
(-n
это сухой -режим работы -. Удалите его, если вас устраивают предложенные -имена ).
1 по причинам, обсуждаемым здесь:Как узнать дату создания файла?