Это попыталось бы соответствовать с начала:
t=TMP_ABC_SEQ_NUM
for n in $(seq 0 ${#t})
do
grep ${t:n} dictionary.txt && break
done
Это ищет самую длинную последовательность, неважно, где она запускается:
for len in $(seq ${#t} -1 3)
do
for start in $(seq 0 $((${#t}-len)))
do
grep ${t:start:len} dictionary.txt && break 2
done
done
требование: подобная удару оболочка, доступная здесь: собственные win32 порты многих GNU-utils, как sh.exe, grep, sed, awk, до н.э, кошка, tac, версия, седло, сокращение...
Вы ищете это?
$ mv file dir/
mv: cannot stat ‘file’: No such file or directory
$ mv file dir/ 2>/dev/null
# <---- Silent ----->
На самом деле я не думаю, отключая звук mv
хороший подход (помните, что он мог бы сообщить о Вас также относительно других вещей, которые могли бы представлять интерес..., например, то, чтобы избегать ~/bar
). Вы хотите отключить звук его только в случае, если Ваше выражение шарика не возвращает результаты. На самом деле скорее не выполняют его вообще.
[ -n "$(shopt -s nullglob; echo foo*)" ] && mv foo* ~/bar/
Не выглядит очень привлекательным, и работает только в bash
.
ИЛИ
[ 'foo*' = "$(echo foo*)" ] || mv foo* ~/bar/
только кроме Вас находятся в bash
с nullglob
набор. Вы расплачиваетесь 3x повторение шаблона шарика все же.
find . -maxdepth 1 -name 'foo*' -type f -print0 | xargs -0r mv -t ~/bar/
— GNU mv
имеет хорошее "место назначения сначала" опция (-t
) и xargs
может пропустить выполнение его команды, если нет никакого входа вообще (-r
). Используя -print0
и -0
соответственно удостоверяется, что не было бы путаницы, когда имена файлов содержат пробелы и другой "забавный" материал.
Я предполагаю, что Вы используете удар, потому что эта ошибка зависит от поведения удара для расширения несопоставленных шариков до себя. (Для сравнения zsh повышает ошибку при попытке развернуть несопоставленный шарик.)
Так, что относительно следующего обходного решения?
ls -d foo* >/dev/null 2>&1 && mv foo* ~/bar/
Это тихо проигнорирует mv
если ls -d foo*
сбои, при тихом входе ошибок, если ls foo*
успешно выполняется, но mv
сбои. (Остерегайтесь, ls foo*
мог перестать работать по другим причинам, чем foo*
не существующий, например, недостаточные права, проблема с FS, и т.д., таким образом, такие условия были бы тихо проигнорированы этим решением.)
bash
). +1 для принятия во внимание факта это mv
мог бы перестать работать по другим причинам, чем foo*
не существующий.
– Jonik
22.08.2013, 15:27
ls
команда не была бы очень четкой для будущих читателей, по крайней мере, без комментария.)
– Jonik
22.08.2013, 15:28
Можно сделать, например,
mv 1>/dev/null 2>&1 foo* ~/bar/
или mv foo* ~/bar/ 1&>2
Для получения дополнительной информации см.: http://mywiki.wooledge.org/BashFAQ/055
mv foo* ~/bar/ 1&>2
не заставляет команду замолчать, она отправляет то, что было бы на stdout, чтобы также быть на stderr.
– Chris Down
21.08.2013, 15:15
/dev/null
с NUL
– Rian Sanderson
10.03.2016, 20:46
1
и 2
средний?
– Aaron Franke
15.12.2016, 22:20
Можно обмануть (портативно) с perl
:
perl -e 'system "mv foo* ~/bar/" if glob "foo*"'
Если Вы собираетесь использовать Perl, Вы могли бы также пойти полностью:
#!/usr/bin/perl
use strict;
use warnings;
use File::Copy;
my $target = "$ENV{HOME}/bar/";
foreach my $file (<foo*>) {
move $file, $target or warn "Error moving $file to $target: $!\n";
}
или как острота:
perl -MFile::Copy -E 'move $_, "$ENV{HOME}/bar/" or warn "$_: $!\n" for <foo*>'
(Для получения дополнительной информации move
управляйте, см. документацию для File::Copy.)
Вероятно, это не лучший вариант, но вы можете использовать команду find
, чтобы проверить, пуста ли папка:
find "foo*" -type f -exec mv {} ~/bar/ \;
mv foo* ~/bar/ 2>/dev/null
Успешна ли команда выше или нет, мы можем определить по статусу завершения предыдущей команды
command: echo $?
если вывод echo $? отличается от 0 означает, что команда не удалась если вывод равен 0, значит, команда выполнена успешно
Этот код работал у меня в случае файла, когда вы находитесь в исходном местоположении.
[ -f ${fileName} ] && mv ${source}/${fileName} ${destination}
В случае каталога
[ -d ${source} ] && mv ${source} ${destination}
set -e
(который должен использоваться в каждом сценарии оболочки), перестанет работать. можно добавить a|| true
деактивировать проверку на единственную команду. – reto 21.08.2013, 19:28set -e
не должен использоваться в каждом сценарии оболочки, во многих случаях он делает управление обработкой ошибок еще более сложным, чем это без. – Chris Down 04.11.2013, 11:12