Ядро генерирует файлы устройств, но такие функции, как read
и write
, в основном реализуются драйверами, которые могут быть интегрированы в ядро.
Хорошая бесплатная (Creative Commons) книга рассказывает об этом: Драйверы устройств Linux
Простой способ сделать это:
mv `ls -t ContractAdjustments.*.txt | awk '{ iteration+=1; if (iteration > 1) { print } } ' ` ARCHV
Конечно, это приведет к ошибкам в пограничных условиях (, например, если в каталоге )есть только один файл, но это всегда будет работать.
Поместите список всех файлов, кроме первого, в переменную и запустите для него цикл for.
listinmemory=`ls -alht | tail -n +5 | awk '{print $9}'`; for each in $listinmemory; do mv $each /path/to/directory; done
ls -alht
перечислит 4 строки, на которых вы не хотите ничего запускать,
total 123K
drwxr-xr-x. 5 user user 1.0K Jun 27 09:20.
drwx------. 13 user user 2.0K Jun 27 10:36..
-rw-rw-r--. 1 user user 3.0K Jun 6 18:29 file1
самый последний файл и 3 строки --затем все файлы, которые вы делаете, поэтому tail -n +5
пропустит первые 4 строки и запустит mv $each /path/to/directory
для всех найденных файлов!
Не рекомендуется разбирать ls
, поэтому в вашем случае cd
в каталог и используйте это:
for CA in $(find. -maxdepth 1 -type f -name ContractAdjustments\*.txt | head --lines=-1); do mv $CA /path/to/archive/; done
Использование цикла for
с подстановкой команд, который находит все файлы в каталоге, начиная с указанного вами формата ContractAdjustments*.txt
, и перечисляет их в порядке от самых старых до самых новых в соответствии с датой создания. второй октет. Затем он передается в --head --lines=-1
, который печатает все, кроме последней строки, которая является самым новым файлом, и передает значение в переменную CA
(для ContractAdjustments ). Наконец, do
использует mv
для перемещения всех файлов, кроме самого нового, в расположение архива.
#!/bin/sh
mkdir -p ARCHIVE || exit 1
newest=
for file in ContractAdjustments.*.txt; do
if [ -f "$file" ]; then
if [ -z "$newest" ]; then
# this is the first file, initialize "newest"
newest=$file
elif [ "$file" -nt "$newest" ]; then
# file is newer than "newest",
# archive "newest" and set new newest file
mv -i "$newest" ARCHIVE
newest="$file"
else
# file is older, archive it
mv -i "$file" ARCHIVE
fi
fi
done
if [ -n "$newest" ]; then
printf 'Done. Newest file = %s\n' "$newest"
else
echo 'No files found'
fi
Этот скрипт, при условии, что /bin/sh
реализует тест -nt
в своей [
встроенной -команде, перемещает все старые файлы в папку ARCHIVE
, сохраняя при этом самый новый файл нетронутым.
Он делает это, перебирая имена файлов, соответствующие заданному шаблону, и для каждого файла проверяя его отметку времени относительно самого нового файла, найденного на данный момент, перемещая файлы в зависимости от того, являются ли они более новыми или старыми.
Сценарий должным образом заботится о сохранении любых пробелов и т. д. в именах файлов.Это может не быть проблемой в данном конкретном случае, но в целом имя файла Unix может содержать как пробелы, так и встроенные символы новой строки, а также символы подстановки имени файла.
Если вы хотите следовать тому, как имя файла сортируется, а не по меткам времени в файлах:
#!/bin/sh
mkdir -p ARCHIVE || exit 1
set -- ContractAdjustments.*.txt
while [ "$#" -gt 1 ]; do
mv -i "$1" ARCHIVE
shift
done
printf 'Done. Newest file = %s\n' "$1"
Это установит позиционные параметры ($1
, $2
и т. д. )в список файлов, соответствующих данному шаблону. Затем, пока в списке еще больше одного файла, переместите первый файл в списке в каталог ARCHIVE
и удалите его из списка. Последний файл в списке — это тот, который сортируется последним по имени файла (этот файл остается на месте ).