Я думаю, что вы пытаетесь скопировать только последнюю версию.
#!/bin/bash
oldlocation="/file_path/"
newlocation="/new_path/"
cd "$oldlocation"
#Get the last version
file="$(ls *SNAPSHOT.txt | sort -V | tail -n1)"
cp -v "$file" "$newlocation"
echo "Everything is ok"
Возьмем этот образец файла:
$ cat file.txt
=putSomething here;
Теперь, чтобы найти все такие .txt
файлы в текущем каталоге:
$ grep -n '^[[:space:]]*=' *.txt
file.txt:1: =putSomething here;
Если вы хотите найти все такие .txt
файлы в текущем каталоге и во всех его подкаталогах, затем используйте:
$ grep -rn '^[[:space:]]*=' --include '*.txt'
subdir/another.txt:1: =putSomething here;
file.txt:1: =putSomething here;
find
и xargs
здесь не нужны . С опцией -r
grep
выполняет рекурсивный поиск в подкаталогах.
--include '*.txt'
ограничивает grep
файлами, соответствующими glob *.txt
.
^
соответствует началу строки. [[:space:]]*
соответствует нулю или более пробельным символам. =
соответствует знаку равенства. В регулярных выражениях POSIX нет ничего особенного в =
, поэтому его можно рассматривать как любой другой символ.
Завершение регулярного выражения grep с помощью .*$
не меняет совпадающие строки. .*$
совпадает либо с любыми символами, либо без символов. Единственная причина использовать .*$
— изменить то, что grep выделяет как совпадающий текст.
Строка, начинающаяся с =
, преобразуется в регулярное выражение ^=
.
Ваша команда поиска должна быть:
find. -name "*.txt" | xargs grep '^='
Или, лучше (избегать бесполезного использованияxargs
):
find. -type f -name "*.txt" -exec grep '^[[:space:]]*=' {} +
(здесь из-за окончания +
выполняется только один grep для кучи файлов)
Попробовал приведенную ниже команду, похоже, она работает.
grep -rn '^ *=' **/*txt
В качестве альтернативы рекурсивным grep
иxargs
:
$ find /dir -type f -name "*.txt" -exec grep -q '^[[:space:]]*=' {} ';' -print
Это будет искать в/dir
(и ниже )все обычные файлы, имена которых соответствуют заданному шаблону. Для каждого такого файла, если grep -q '^[[:space:]]*='
завершается с нулевым статусом выхода (шаблон совпал где-то в файле ), то выводится его имя.
Или, если вы просто хотите увидеть сами строки:
$ find /dir -type f -name "*.txt" -exec grep '^[[:space:]]*=' {} '+'
+
в конце будет передавать как можно больше имен файлов при каждом вызове grep
, тогда как использование ;
, как в моем первом примере, будет передавать только один файл за раз.