Выберите отображаемые столбцы с помощью опции -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 в значительной степени, если не полностью игнорирует её.
Выполните правильный синтаксический анализ командной строки, а затем выберите способ фактического пробного запуска.
Разбор командной строки:
#!/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"