У вас почти все получилось с первого раза. Ответ awk
подходит для вашего конкретного случая, но причина, по которой вы получали ошибку, заключается в том, что вы пытались использовать grep
, как если бы он искал файл вместо переменной .
Кроме того, при использовании регулярных выражений я всегда использую grep -E
на всякий случай. Я также слышал, что обратные кавычки устарели и их следует заменить на $ ()
.
Правильный способ grep
переменной с оболочками, поддерживающими herestrings , заключается в использовании перенаправления ввода с тремя из этих парней: , так что ваш
grep
(переменная $ ip
) должна выглядеть следующим образом:
ip="$(grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' <<< "$line")"
Если это файл, который вы ищете, я всегда использую цикл while
, поскольку он гарантированно идет построчно, тогда как для
циклы часто сбрасываются, если есть какие-то странные интервалы. Вы также реализуете бесполезное использование cat
, которое также можно заменить перенаправлением ввода.Попробуйте следующее:
while read line; do
ip="$(grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' <<< "$line")"
echo "$ip"
done < "abd"
Кроме того, я не знаю, какую ОС или версию grep
вы используете, но escape-символ, который у вас был до фигурных скобок, обычно не требуется, когда я использовал эту команду в прошлое. Это могло быть из-за использования grep -E
или из-за того, что я использую его в кавычках и без обратных кавычек - я не знаю. Вы можете попробовать это с или без и просто посмотреть, что из этого получится.
Независимо от того, используете ли вы цикл for
или цикл while
, это зависит от того, какой из них работает для вас в вашей конкретной ситуации, и если время выполнения имеет первостепенное значение. Мне не кажется, что OP пытается назначить отдельные переменные каждому IP-адресу, но он хочет назначить переменную каждому IP-адресу в строке, чтобы он мог использовать ее в самом цикле - в котором в этом случае ему нужна только одна переменная $ ip
на итерацию. Я придерживаюсь своего оружия на этом.
Если файлы имеют не -уникальные имена, то
cp "Main Directory"/*/Subsubdirectory1/* destdir
перезапишет некоторые файлы в месте назначения. Это также потерпит неудачу, если есть тысячи совпадающих путей.
Чтобы обойти это, используйте GNUcp
:
for pathname in "Main Directory"/*/Subsubdirectory1/*; do
cp --backup=numbered "$pathname" destdir
done
Это приведет к созданию пронумерованных резервных копий файлов, которые в противном случае были бы перезаписаны.
То же самое, но с использованием не -GNUcp
:
for pathname in "Main Directory"/*/Subsubdirectory1/*; do
# create first stab at destination pathname
dest="destdir/${pathname##*/}"
i=0
while [ -e "$dest" ]; do
# destination name exists, remove backup number from end of
# pathname and replace with next one in the sequence
i=$(( i + 1 ))
dest="${dest%.~*~}.~$i~"
done
cp "$pathname" "$dest"
done
Попробуйте это:
cp mainDir/*/SubsubDirectory1/* <destination_path>
Примечание. :имена файлов должны быть разными.