Переместить файлы в папку внутри папки

Это сложно. Вот что я придумал; его можно упростить / оптимизировать:

#!/bin/sh

pid1file=$(mktemp)
pid2file=$(mktemp)
stat1file=$(mktemp)
stat2file=$(mktemp)

while true; do sleep 42; done &
main_sleeper=$!

(cd frontend && gulp serve           & echo "$!" > "$pid1file";
    wait "$!" 2> /dev/null; echo "$?" > "$stat1file"; kill "$main_sleeper" 2> /dev/null) &
(cd backend  && gulp serve --verbose & echo "$!" > "$pid2file";
    wait "$!" 2> /dev/null; echo "$?" > "$stat2file"; kill "$main_sleeper" 2> /dev/null) &
sleep 1
wait "$main_sleeper" 2> /dev/null

if stat1=$(<"$stat1file")  &&  [ "$stat1" != "" ]  &&  [ "$stat1" != 0 ]
then
        echo "First process failed ..."
        if pid2=$(<"$pid2file")  &&  [ "$pid2" != "" ]
        then
                echo "... killing second process."
                kill "$pid2" 2> /dev/null
        fi
fi
if [ "$stat1" = "" ]  &&  \
   stat2=$(<"$stat2file")  &&  [ "$stat2" != "" ]  &&  [ "$stat2" != 0 ]
then
        echo "Second process failed ..."
        if pid1=$(<"$pid1file")  &&  [ "$pid1" != "" ]
        then
                echo "... killing first process."
                kill "$pid1" 2> /dev/null
        fi
fi

wait
if stat1=$(<"$stat1file")
then
        echo "Process 1 terminated with status $stat1."
else
        echo "Problem getting status of process 1."
fi
if stat2=$(<"$stat2file")
then
        echo "Process 2 terminated with status $stat2."
else
        echo "Problem getting status of process 2."
fi
  • Во-первых, запустите процесс ( пока true; do sleep 42; done & ) , который засыпает / приостанавливается навсегда. Если вы уверены, что ваши две команды завершатся в течение определенного периода времени (например, часа), вы можете изменить это на один сон, который превысит этот {{1} } (например, спящий режим 3600 ). Затем вы можете изменить следующую логику, чтобы использовать это как тайм-аут; т. Е. Убить процессы, если они все еще работают по прошествии этого времени. (Обратите внимание, что приведенный выше сценарий в настоящее время этого не делает.)
  • Запустите два асинхронных (одновременных фоновых) процесса.
    • Вам не нужно ./ для cd .
    • команда & echo "$!" > где-то ; wait "$!" - сложная конструкция, которая запускает процесс асинхронно, захватывает его PID, а затем ждет его; делая его своего рода передним планом (синхронный) процесс. Но это происходит в списке (…) , который полностью находится в фоновом режиме, поэтому процессы gulp выполняют работать асинхронно.
    • После выхода из любого из процессов gulp записывает свой статус во временный файл и завершает процесс «вечного сна».
  • sleep 1 для защиты от состояния гонки , когда первый фоновый процесс умирает до того, как второй получит возможность записать свой PID в файл.
  • Дождитесь завершения процесса «вечного сна». Это происходит после выхода либо из gulp процессов, как указано выше.
  • Посмотрите, какой фоновый процесс завершился. Если не получилось, убейте другого.
  • Если один процесс завершился неудачно и мы завершили работу другого, подождите, пока второй процесс завершится, и сохранит свой статус в файл. Если первый процесс завершился успешно, дождитесь завершения второго.
  • Проверить статусы двух процессов.
0
06.03.2018, 22:02
4 ответа

Otra forma usando lsy grep -v. La opción -vinvierte la coincidencia para que solo se enumeren las líneas que no coinciden.

mv `ls | grep -v folder2` folder2

Tenga en cuenta que se utilizan acentos graves y no comillas simples en el comando.

2
28.01.2020, 02:18

find +mvsolución:

find folderN/ -mindepth 1 ! -wholename '*/folder2' -exec mv "{}" "folderN/folder2" \;
0
28.01.2020, 02:18

Mueva la segunda carpeta un paso hacia arriba, mueva el contenido y luego mueva la segunda carpeta hacia atrás. así:

cd folder1
mv folder2..
mv *../folder2/
mv../folder2.
2
28.01.2020, 02:18

¿Está informando que no puede mover el contenido de una carpeta a otra? ¿Es esta la secuencia de eventos que ha intentado?

$ ls folderN
file1 file2 folder1 folder2
$mv folderN/* folder2
mv: cannot move 'folder2 to a subdirectory of itself, `folder2/folder2`
$ls folderN/folder2
file1 file2 folder1

mv folderN/* folderN/folder2debería ser el único comando que necesita.

0
28.01.2020, 02:18

Теги

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