Файлы вида согласно их расширениям

screen -dAr default || screen -AS default работы для меня. Я добавляю это к своему ~/.bashrc.

Кратко объяснение переключателей:

  • d - Отсоедините экран, если он все еще присоединен от другой сессии.
  • A - Адаптируйте окна на экране к новому терминальному размеру.
  • r default - Присоедините к экрану, названному значением по умолчанию.

Если первая экранная команда (та прежде ||) не успешно выполняется, второй выполняется:

  • A - Как объяснено выше...
  • S default - Создайте новую экранную сессию со значение по умолчанию имени.
2
24.11.2014, 00:01
2 ответа

Хотя общая проблема идентификации расширений сложна, можно немного почистить скрипт:

  1. Скажите найти , чтобы рассматривать файлы только с расширением: -имя '*.*'
  2. Используйте awk вместо cutting себе:
  3. Используйте скрипт, а затем скажите find для выполнения этого скрипта.

Таким образом: скрипт, названный, скажем, move.sh :

#! /bin/bash
for i
do
    ext=/some/where/else/$(awk -F. '{print $NF}' <<<"$i")
    mkdir -p "$ext"
    mv "$i" "$ext"
done

Затем запустите find таким образом:

find . -name '*.*' -type f -exec move.sh {} +

Проблема в том, что вы не можете переставить все файлы в папке, поэтому вы можете использовать xargs:

find . -name '*.*' -type f -print0 > /tmp/temp
xargs -0 move.sh < /tmp/tmp

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

Что-то вроде:

find . -name '*.*' -type f -print0 | sed -z 's/.*\.//g' | sort -zu > /tmp/file-exts

Это должно дать вам список уникальных расширений файлов. Тогда наш move.sh будет выглядеть так:

#!/bin/bash
for i
do
    mkdir -p "$i"
    find . -name "*.$i" -type f -exec mv -t "$i" {} +
done

И мы запустим его:

xargs -0 move.sh < /tmp/file-exts

Я делаю довольно много предположений в этом посте, таких как sed и sort, поддерживающих -z (позволяя им работать с NUL-терминированными строками, которые находят и xargs процветают).

1
27.01.2020, 22:00

Вам нужно добавить PID_FILE и SIG_NUM в dnsmasq.conf, подобное так:

# logfilename          [owner:group]    mode count size   when  flags [/pid_file]           [sig_num]
/var/log/dnsmasq.log   nobody:admin     640  5     10000  *     Z     /var/run/dnsmasq.pid  31

SIG_NUM 31 - SIGUSR2, который скажет DNSMASQ, чтобы закрыть и открыть свой файл журнала.

-121--146195-

Рекурсируя в подкаталоги

Разборки выхода Найти не является удаленным. Что, если в нем было имя файла с новой строкой? Использование Найти ... -Exec ... , который гарантирует надежную обработку.

find . -type f -exec sh -c '…' {} \;

Shell Snippet ... получает имя файла в $ 0 . Обратите внимание, что это отдельный процесс оболочки, он не наследует переменные или функции из сценария дедушка. Вы можете ускорить обработку, используя тот же подпроцесс оболочки для обработки нескольких файлов.

find . -type f -exec sh -c 'for x; do … done' _ {} +

На этот раз внутри цикла имени файла находится в переменной x .

Разбие имя файла

, вызывающее внешние утилиты, такие как , , , , вырезан и т. Д. Хрупкая: вы должны быть чрезвычайно осторожны Вам не нужно: встроенные функции обработки строки оболочки достаточно для того, что вы хотите сделать здесь. Учитывая имя файла $ x :

directory=${x%/*}
basename=${x##*/}
extension=…
if [ -n "$extension" ]; then
  mkdir -p "$directory/extension"
  mv "$x" "$directory/extension"
fi

Расширение

Что такое расширение файла? Это часть после одного из . в именах. Там нет стандарта, который говорит, какой. Вам решать, что вы считаете расширением в таких случаях, как Foo.tar.gz или BAR-1.2 .

Вот какой-то пример кода, который рассматривает общие расширения сжатия в гнездо, и это требует расширений для содержания буквы, так что Foo-1.2.tar.gz считается расширением TAR. Гз .

extension=
while case "${basename##*.}" in
        gz|bz2|xz) extension=.${basename##*.}$extension;; # stackable extension
        *) false;;
do
  basename=${basename%.*}
done
case "${basename##*.}" in
  "$basename") :;; # no . ==> no extension
  *[!0-9A-Za-z]*) :;; # only allow alphanumeric characters
  *[A-Za-z]*) extension=${basename##*.}$extension;; # non-stackable extension
  *) false;; # require at least one letter
esac
extension=${extension#.}
3
27.01.2020, 22:00

Теги

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