Вот вариант, совместимый с POSIX, без использования циклов. Элементы в file-list.txt
разделяются символами новой строки.
cd A ; xargs -I{} -- mv -- {} B < file-list.txt
Очевидно, что этот вариант не позволяет использовать имена файлов, содержащие символы новой строки. Кроме того, он вызывает команду mv
для каждого файла отдельно.
Вариант Дэвида Ферстера использует расширения GNU xargs
и mv
. Он будет вызывать один экземпляр mv
для нескольких аргументов и будет более эффективным для длинных списков файлов. Он по-прежнему не разрешает имена файлов, содержащие символы новой строки. Чтобы обойти это ограничение, вы можете использовать опцию -0
и разделять имена файлов символами\0
(NULL ).
cd A ; xargs -r0 -- mv -t B -- < file-list.txt
Псевдонимы определяют способ замены маркера оболочки некоторой строкой перед тем, как событие оболочки попытается проанализировать код. Это не структура программирования, как функция.
В
alias pushd='pushd "$@" > /dev/null'
, а затем:
pushd.
Происходит то, что pushd
заменяется на pushd "$@" > /dev/null
, а затем анализируется результат. Таким образом, оболочка завершает синтаксический анализ:
pushd "$@" > /dev/null.
Перенаправления могут появляться в любом месте командной строки, так что это точно так же, как:
pushd "$@". > /dev/null
или
> /dev/null pushd "$@".
Когда вы запускаете это из командной строки, "$@"
— это список аргументов, полученных вашей оболочкой, поэтому, если вы не запустили set arg1 arg2
, он, вероятно, будет пустым, поэтому он будет таким же, как
pushd. > /dev/null
Но внутри функции эти "$@"
будут аргументами функции.
Здесь,вы либо хотите определить pushd
как функцию типа:
pushd() { command pushd "$@" > /dev/null; }
Или псевдоним типа:
alias pushd='> /dev/null pushd'
или
alias pushd='pushd > /dev/null