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

У вас почти все получилось с первого раза. Ответ 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 на итерацию. Я придерживаюсь своего оружия на этом.

0
10.07.2018, 11:29
2 ответа

Если файлы имеют не -уникальные имена, то

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
4
28.01.2020, 02:18

Попробуйте это:

cp mainDir/*/SubsubDirectory1/* <destination_path>

Примечание. :имена файлов должны быть разными.

1
28.01.2020, 02:18

Теги

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