Какое особое значение делает «#» в рамках параметра-расширения?

Ядро генерирует файлы устройств, но такие функции, как read и write, в основном реализуются драйверами, которые могут быть интегрированы в ядро.

Хорошая бесплатная (Creative Commons) книга рассказывает об этом: Драйверы устройств Linux

1
27.06.2018, 04:56
4 ответа

Простой способ сделать это:

mv `ls -t ContractAdjustments.*.txt | awk '{ iteration+=1; if (iteration > 1) { print } } ' ` ARCHV

Конечно, это приведет к ошибкам в пограничных условиях (, например, если в каталоге )есть только один файл, но это всегда будет работать.

0
27.01.2020, 23:43

Поместите список всех файлов, кроме первого, в переменную и запустите для него цикл 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для всех найденных файлов!

0
27.01.2020, 23:43

Не рекомендуется разбирать 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для перемещения всех файлов, кроме самого нового, в расположение архива.

0
27.01.2020, 23:43
#!/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и удалите его из списка. Последний файл в списке — это тот, который сортируется последним по имени файла (этот файл остается на месте ).

1
27.01.2020, 23:43

Теги

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