Основываясь на ответе Ориона , less (1)
справочная страница описывает
/ шаблон
Поиск вперед в файле N -й строки , содержащей шаблон
. N † по умолчанию 1. Шаблон
является регулярным выражением, как распознается библиотека регулярных выражений, предоставляемая вашей системой. Поиск начинается со второй отображаемой строки (но см. Параметры
-a
и-j
, которые меняют это). {{1} }Некоторые символы являются специальными , если вводятся в начале шаблона
; они скорее изменяют тип поиска чем стать частью шаблона
:
^ N
или!
Искать строки, которые НЕ соответствуют шаблону
.
^ E
или*
Поиск нескольких файлов. То есть, если поиск достигает КОНЕЦ текущего файла , не находя совпадения, поиск продолжается в следующем файле в списке командной строки.
^ F
или@
Начните поиск с первой строки ПЕРВОГО файла в списке командной строки, независимо от того, что в данный момент отображается на экран или настройки параметров
-a
или-j
.^ K
Выделите любой текст , который соответствует шаблону
на текущем экране, , но не переходите к первому совпадению (СОХРАНИТЬ текущую позицию) .
^ R
Не интерпретируйте метасимволы регулярных выражений, то есть проводите простое текстовое сравнение.
____________
† Командам может предшествовать десятичное число, называемое N в описании…
(Конечно ] ^ N
и ^ E
и т. Д. Представляют собой
Ctrl + N и Ctrl + E и т. Д.)
Оказывается, что паттерн и
и / паттерн
хорошо работают вместе.
Например, команды
&! Arp | dns
Введите /
Ctrl + K fail | fatal | fault | sd [az ] [0-9]
Введите в любом порядке, чтобы скрыть (исключить) все строки
, содержащие arp
или dns
(например, ] grep -v
), а затем в оставшихся строках
выделите все вхождения fail
, fatal
, fault
,
или что-нибудь похожее на имя устройства SCSI ( sd [az] [0-9]
).
Обратите внимание, что строки, содержащие arp
или dns
,
, а также не содержат
или любые другие опасные слова, {{ 1}} не будет отображаться , но не .
rsync
tiene una bandera, --existing
, que evitará copiar archivos que aún no existen en el destino:
find. -type f -name '*.txt' -exec rsync --existing {} "$HOME/alltxt/" ';'
También agregué -type f
para asegurarme de que find
solo encuentre archivos normales , y eliminé el indicador -R
(--relative
)de rsync
porque no creo es útil en este caso (usar este indicador también es la razón por la que obtiene los subdirectorios en el destino ). También estoy usando $HOME
en lugar de ~
porque creo que se ve mejor.
También puede agregar-a
(--archive
)a la invocación rsync
para preservar la propiedad y los tiempos de modificación, etc.
Un enfoque similar, pero usando cp
en lugar dersync
:
find. -type f -name '*.txt' \
-exec sh -c 'for n; do d="$HOME/alltxt/${n##*/}"; [ -f "$d" ] && cp "$n" "$d"; done' sh {} +
Esto encuentra todos los archivos .txt
y llama a un script de shell corto:
for n; do
d="$HOME/alltxt/${n##*/}"
[ -f "$d" ] && cp "$n" "$d"
done
Este ciclo obtiene una cantidad de .txt
archivos de find
. Para cada uno de estos nombres n
, crea la ruta del archivo de destino en d
,comprueba si esta ruta se refiere a un archivo regular existente y, de ser así, copia allí el archivo dado.
En lugar de la prueba [ -f "$d" ]
, podría usar [ "$d" -ot "$n" ]
, que se cumplirá si el archivo de destino existe y es más antiguo que el archivo encontrado. Esta es una prueba no estándar pero es compatible con la mayoría de los shells.
La sustitución de variable ${n##*/}
eliminará los directorios de la ruta en n
, de modo que ./some/path/file.txt
se convierta en solofile.txt
(el nombre base ). Podría ser reemplazado por $(basename "$n")
.
shopt -s globstar
cp --update --target-directory targetDirectory sourceRootDir/**/*.txt
donde:
shopt -s globstar
establece las opciones extendidas de globbing, que incluyen el patrón **
--target-directory
o -t
da un directorio de destino para copiar a (también se puede especificar al final de todos los argumentos, pero a menudo es más legible ponerlo aquí en scripts ). --update
o -u
hace que cp
copie el archivo solo si el destino es más antiguo i o no -existente.