Как можно переместить или скопировать определенные файлы из списка текстовых файлов

Вы правы, что это цитата. Заключая удаленную команду в двойные кавычки, вы указываете локальной оболочке интерпретировать все, что она может передать сеансу ssh. В данном случае команда cat .

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

локальный файл:

bash-[501]$ echo $(hostname) > /tmp/samplefile
bash-[506]$ echo $(cat /tmp/samplefile)
tank

создать удаленный файл:

bash-[502]$ ssh evil 'echo $(hostname) > /tmp/samplefile'
bash-[501]$ cat /tmp/samplefile
evil

попытаться просмотреть удаленный файл в двойных кавычках:

bash-[508]$ ssh evil "echo `cat /tmp/samplefile`"
tank

попытаться просмотреть удаленный файл в одинарных кавычках:

bash-[509]$ ssh evil 'echo `cat /tmp/samplefile`'
evil

определить файл как переменную для обработки на удаленной стороне:

bash-[527]$ ssh evil 'F=/tmp/samplefile; cat $F'
evil

В вашем случае, заключая команду в одинарные кавычки и определяя $ CHECK внутри этих кавычек, чтобы было достаточно, чтобы отправить все для интерпретации на удаленной стороне .

ssh -n test@192.168.1.2 'CHECK=/home/test/Desktop; until [ `cat $CHECK/samplefile | grep "string"` ]; do touch  $CHECK/success; done'
3
02.07.2016, 16:20
1 ответ

Чтение чисел из файла одно за другим и выполнение перемещения (предполагает наличие оболочки POSIX):

while read -r number; do
   name="gre_6_c1_d$number.h3"
   [ -f "$name" ] && mv -i "gre_6_c1_d$number.h3" /other/directory
done <number.list

Это также гарантирует, что номер дает имя файла, существующего в текущем каталоге, перед его перемещением в другой каталог.Кроме того, команда mv -iзапросит подтверждение перед перезаписью существующего файла.


Поскольку этот вопрос был помечен , мы могли бы попросить xargsсгенерировать для нас список чисел:

xargs sh -c '
    for number do
        name="gre_6_c1_d$number.h3"
        [ -f "$name" ] && mv "gre_6_c1_d$number.h3" /other/directory
    done' sh <number.list

Это ничего не ускорит, но если ваш xargsпредоставит флаг -Pдля параллельной работы, вы можете получить небольшой прирост скорости:

xargs -P 5 -n 10 -h sh -c '
    for number do
        name="gre_6_c1_d$number.h3"
        [ -f "$name" ] && mv "gre_6_c1_d$number.h3" /other/directory
    done' sh <number.list

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

0
27.01.2020, 21:39

Теги

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