] Прежде всего, вот образец дерева, который я создал:
{ pwd
for d in ./*/
do cd "$d"
printf '\t%s\n' "${d#??}"
printf '\t\t%s\n' *
cd ..
done
}
/tmp/top
another file/
another file.pdf
fileA/
fileA.pdf
otherdir/
1
2
3
stillanother4544file/
stillanother4544file.pdf
Очевидно, что вам не нужно ничего делать - я создал дерево, которое отражает ваше примерное дерево, и просто добавил несколько выбросов.
Но вот что я рекомендую вам сделать:
pax -rwis'|^./\([^/]*\)/\(\1\....\)$|\2|' -s'|.*||' . ../tgt
Это вызывает стандартную POSIX утилиту pax
в -r
ead / -w
rite mode - режим прямого копирования, в основном. В режиме копирования pax
не создает архив tar
, как обычно в режиме -w
rite, а вместо этого напрямую копирует все файлы, найденные в его ] [... шаблон ...]
аргумент [s] - здесь только .
для дерева с корнем в текущем каталоге - и / или имена, которые оно читает на своем стандартном вводе (в данном случае пусто) - в каталог, названный его последним аргументом, который находится здесь ../ tgt
.
Я знаю, что вы не хотите перемещать все дерево. Многое из этого решается с помощью аргументов -s
ubstitution. Вы можете переименовывать выходные файлы на основе операторов в стиле регулярного выражения sed
, как это делаю я здесь. Я использую два оператора -s
ubstitution. Первый переименовывает все входные совпадения для:
./dirname/samename.???
... в ...
samename.???
... на выходе, тем самым сглаживая выходное дерево, чтобы все скопированные файлы помещались непосредственно в ../ tgt
. Если вы предпочитаете оставить ./ dirname /
родительские каталоги для каждого из них вы можете заменить часть \ 2
первого -s
ubstitution только на и
.
После того, как имя файла было успешно сопоставлено и изменено с помощью pax
-s
ubstitution, оно не будет повторяться ни для каких оставшихся аргументов -s
ubstitution, и только для этих файлов которые еще не могут соответствовать, пробуются для оставшихся регулярных выражений переименования. Это означает, что все файлы, расположенные в текущем каталоге с именами пути, соответствующими типу:
./dirname/samename.???
... успешно выбраны и удаляются из всех компонентов, кроме последних, с помощью первого оператора -s
ubstitution и всех другие файлы, расположенные в текущем каталоге, полностью заменяются второй заменой -s |. * ||
-s
. Это потому, что pax
удаляет из своего списка обработки любое имя файла, заменяющее пустую строку.
После того, как pax
обработал все это, у него есть последняя обязанность, которую нужно выполнить, прежде чем он сможет фактически скопировать выбранные файлы - и это вариант интерактивного переименования -i
, который я указано, и я думаю, что это, вероятно, прямо в вашем переулке.
Из man pax
:
-i
- Интерактивное переименование файлов или членов архива. Для каждого элемента архива, соответствующего операнду
шаблона
, или каждого файла, соответствующего файловому операнду,pax
предложит/ dev / tty
указать имя файла, его файловый режим и время его модификации.pax
затем прочитает строку из/ dev / tty
. Если эта строка пуста, элемент файла или архива пропускается. Если эта строка состоит из одной точки, файл или элемент архива обрабатывается без изменения его имени. В противном случае его имя заменяется содержимым строки.pax
немедленно завершит работу с ненулевым статусом выхода, еслиEOF
обнаружен при чтении ответа или если/ dev / tty
не может быть открыт для чтения и записи .
ATTENTION: pax interactive file rename operation.
-rw-r--r-- Oct 17 04:30 stillanother4544file.pdf
Input new name, or a "." to keep the old name, or a "return" to skip this file.
Input > .
Processing continues, name unchanged.
ATTENTION: pax interactive file rename operation.
-rw-r--r-- Oct 17 04:30 another file.pdf
Input new name, or a "." to keep the old name, or a "return" to skip this file.
Input >
Skipping file.
ATTENTION: pax interactive file rename operation.
-rw-r--r-- Oct 17 04:30 fileA.pdf
Input new name, or a "." to keep the old name, or a "return" to skip this file.
Input > .
Processing continues, name unchanged.
Таким образом, из шести файлов в текущем каталоге только эти три попадают в запросы интерактивного переименования -i
, а из этих трех только два попадают в ../ tgt
:
ls -l ../tgt
-rw-r--r-- 1 mikeserv mikeserv 0 Oct 17 04:30 fileA.pdf
-rw-r--r-- 1 mikeserv mikeserv 0 Oct 17 04:30 stillanother4544file.pdf
La respuesta de @dhag suena bien; si no desea "confiar en que la última línea de la salida de excavación es la IP", puede usar grep
para extraer solo la dirección IP numérica:
dig +short smtp.mydomain.net | grep '^[.0-9]*$'
Я полагаю, что dig +short
выводит для вас две строки, потому что домен вы запрашиваете, smtp.mydomain.net
является CNAME для smtp.ggs.mydomain.net
, и dig печатает шаг промежуточного разрешения.
Вероятно, вы можете полагаться на то, что последняя строка вывода dig является IP-адресом. вы хотите, однако, и поэтому следует сделать следующее:
dig +short smtp.mydomain.net | tail -n1