Существует ли способ сделать сбой “mv” тихо?

Это попыталось бы соответствовать с начала:

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, версия, седло, сокращение...

62
02.05.2015, 00:43
11 ответов

Вы ищете это?

$ mv  file dir/
mv: cannot stat ‘file’: No such file or directory
$ mv  file dir/ 2>/dev/null
# <---- Silent ----->
49
27.01.2020, 19:32
  • 1
    , возвращаемое значение все еще! = 0, поэтому любой set -e (который должен использоваться в каждом сценарии оболочки), перестанет работать. можно добавить a || true деактивировать проверку на единственную команду. –  reto 21.08.2013, 19:28
  • 2
    @reto set -e не должен использоваться в каждом сценарии оболочки, во многих случаях он делает управление обработкой ошибок еще более сложным, чем это без. –  Chris Down 04.11.2013, 11:12
  • 3
    @ChrisDown я вижу Вашу точку. Это обычно - выбор между двумя злом. Но если в сомнении, я предпочитаю неудавшееся успешное выполнение, чем успешный отказ. (который не становится замеченным, пока это не становится видимым клиенту/пользователю). Сценарии оболочки являются большим минным полем для новичков, настолько легко отсутствовать, ошибка и Ваш сценарий выходят из строя! –  reto 04.11.2013, 12:25

На самом деле я не думаю, отключая звук mv хороший подход (помните, что он мог бы сообщить о Вас также относительно других вещей, которые могли бы представлять интерес..., например, то, чтобы избегать ~/bar). Вы хотите отключить звук его только в случае, если Ваше выражение шарика не возвращает результаты. На самом деле скорее не выполняют его вообще.

[ -n "$(shopt -s nullglob; echo foo*)" ] && mv foo* ~/bar/

Не выглядит очень привлекательным, и работает только в bash.

ИЛИ

[ 'foo*' = "$(echo foo*)" ] || mv foo* ~/bar/

только кроме Вас находятся в bash с nullglob набор. Вы расплачиваетесь 3x повторение шаблона шарика все же.

14
27.01.2020, 19:32

find . -maxdepth 1 -name 'foo*' -type f -print0 | xargs -0r mv -t ~/bar/

— GNU mv имеет хорошее "место назначения сначала" опция (-t) и xargs может пропустить выполнение его команды, если нет никакого входа вообще (-r). Используя -print0 и -0 соответственно удостоверяется, что не было бы путаницы, когда имена файлов содержат пробелы и другой "забавный" материал.

13
27.01.2020, 19:32

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

Так, что относительно следующего обходного решения?

ls -d foo* >/dev/null 2>&1 && mv foo* ~/bar/

Это тихо проигнорирует mv если ls -d foo* сбои, при тихом входе ошибок, если ls foo* успешно выполняется, но mv сбои. (Остерегайтесь, ls foo* мог перестать работать по другим причинам, чем foo* не существующий, например, недостаточные права, проблема с FS, и т.д., таким образом, такие условия были бы тихо проигнорированы этим решением.)

3
27.01.2020, 19:32
  • 1
    я главным образом интересуюсь ударом, да (и я действительно отмечал вопрос как bash). +1 для принятия во внимание факта это mv мог бы перестать работать по другим причинам, чем foo* не существующий. –  Jonik 22.08.2013, 15:27
  • 2
    (На практике я, вероятно, не буду использовать это, так как это является довольно подробным, и точка 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

3
27.01.2020, 19:32
  • 1
    mv foo* ~/bar/ 1&>2 не заставляет команду замолчать, она отправляет то, что было бы на stdout, чтобы также быть на stderr. –  Chris Down 21.08.2013, 15:15
  • 2
    и если Вы используете mingw под окнами (как я) замена /dev/null с NUL –  Rian Sanderson 10.03.2016, 20:46
  • 3
    пыли, Как это управляет работой? Что делают амперсанды? Что делает 1 и 2 средний? –  Aaron Franke 15.12.2016, 22:20

Можно обмануть (портативно) с perl:

perl -e 'system "mv foo* ~/bar/" if glob "foo*"'
2
27.01.2020, 19:32
  • 1
    Прокомментируйте прежде downvoting. –  Joseph R. 21.08.2013, 21:40

Если Вы собираетесь использовать 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.)

2
27.01.2020, 19:32
[114650]Вместо

можно сделать

Простой, читабельный :)[114655].

-1
27.01.2020, 19:32

Вероятно, это не лучший вариант, но вы можете использовать команду find , чтобы проверить, пуста ли папка:

find "foo*" -type f -exec mv {} ~/bar/ \;
3
27.01.2020, 19:32
mv foo* ~/bar/ 2>/dev/null

Успешна ли команда выше или нет, мы можем определить по статусу завершения предыдущей команды

command: echo $?

если вывод echo $? отличается от 0 означает, что команда не удалась если вывод равен 0, значит, команда выполнена успешно

0
27.01.2020, 19:32

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

[ -f ${fileName} ] && mv ${source}/${fileName} ${destination}

В случае каталога

[ -d ${source} ] && mv ${source} ${destination}
1
04.04.2020, 07:01

Теги

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