Добавьте в скрипт некоторую опцию пробного прогона

Выберите отображаемые столбцы с помощью опции -o . Если ввести = после имени столбца, строка заголовка будет подавлена.

ps -o pid= -p 1 23 456
ps -o pid= -o ppid= -o pgid= -o sid= -p 1 23 456

-121--19395-

Если я правильно понимаю, вы хотите переместить файлы из текущего каталога и его подкаталогов рекурсивно в другой каталог, но только если команда file сообщит их как файлы «Microsoft Word». То есть вас интересуют файлы, для которых файл «$ filename» | grep 'Microsoft Word' выдает некоторые выходные данные.

Простой способ - спокойно относиться к делу и отправлять его в файл. Если требуется только файлы в текущем каталоге, можно использовать для цикла и подстановочный символ образца:

for f in *.doc; do
  if …
done

Какое условие? Необходимо проверить, отображается ли Microsoft Word в выходных данных файла «$ f» . Я использую file -- для защиты от файлов, имя которых начинается с - .

for f in *.doc; do
  if file -- "$f" | grep -s 'Microsoft Word'; then
    …
  fi
done

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

for f in *.doc; do
  if file -- "$f" | grep -s 'Microsoft Word'; then
    mv -- "$f" ../NewDirectory/
  fi
done

Для поиска файлов в подкаталогах используйте для рекурсивного глоббинга подстановочный символ * * образцы . В bash его необходимо активировать с помощью shopt -s globstar (в ksh93 необходимо set -o globstar , а в zsh он работает вне коробки; у других оболочек эта особенность отсутствует). Остерегайтесь того, что bash ≤4.2 следует символические ссылки на каталоги.

for f in **/*.doc; do
  if file -- "$f" | grep -s 'Microsoft Word'; then
    mv -- "$f" ../NewDirectory/
  fi
done

Обратите внимание, что все перемещенные файлы заканчиваются на ../NewDirectory/, подкаталоги не создаются. Если требуется воспроизвести дерево каталогов, можно использовать строковые конструкции управления для извлечения части каталога имени файла и mkdir -p для создания целевого каталога при необходимости.

for f in ./**/*.doc; do
  if file "$f" | grep -s 'Microsoft Word'; then
    d="${f%/*}"
    mkdir -p ../NewDirectory/"$d"
    mv "$f" ../NewDirectory/"$d"
  fi
done

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

-121--87462-

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

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

0
27.03.2018, 13:14
1 ответ

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

Разбор командной строки:

#!/bin/sh

dry_run=false

while getopts 'n' opt; do
    case "$opt" in
        n) dry_run=true ;;
        *) echo 'error in command line parsing' >&2
           exit 1
    esac
done

Теперь $dry_runбудет true, если пользователь вызвал сценарий с параметром командной строки -n.

Затем выберите способ выполнения пробного запуска. Простым способом было бы использоватьset -v(отображать команды по мере их чтения оболочкой ), а затемset -n(фактически не запускать ничего):

if "$dry_run"; then
    set -v
    set -n
fi

Возможно, это не то, что вам нужно, так как это просто отобразит скрипт.

Вместо этого вы можете

if "$dry_run"; then
    cmd=echo
else
    cmd=''
fi

, а затем добавьте префикс к конкретным командам, которые вы хотите запустить в пробном режиме, с$cmd:

$cmd ls -l
$cmd echo "hello world"
5
28.01.2020, 02:32

Теги

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