Разветвление трубопровода в оболочке
Прежде всего, я пытался искать похожие темы в Google и Stackru, но ничего подобного не нашел.
ВОПРОС:
Есть ли способ обработки разветвления трубопровода в оболочке?
ПРИМЕР:
У меня есть следующее дерево каталогов:
> 1
>> 1.a
>> 2.a
>> 3.a
> 2
>> 1.b
>> 2.b
>> 3.b
Когда я выполняю команду:
ls -1 */* | nl
Я получаю следующий вывод:
1 1/1.a
2 1/2.a
3 1/3.a
4 2/1.b
5 2/2.b
6 2/3.b
Если бы я хотел сослаться на первый столбец, я бы использовал cut с параметром -f1. Точно так же, если бы я хотел сослаться на второй столбец, я бы использовал параметр -f2. Могу ли я использовать приведенную ниже команду каким-либо образом?
ls -1 */* | nl | mv `cut -d' ' -f1` `cut -d' ' -f2`
Я не против способа переименования файлов. Я на самом деле хочу знать, существует ли параллельная конвейерная обработка в оболочке.
2 ответа
Разбор вывода ls
настоятельно не рекомендуется; Я бы использовал следующее вместо этого.
count=1
for f in */*; do
echo mv "$f" $((count++))
done
Вы можете использовать это для цикла:
while read -r f1 f2; do
[[ -n "$f1" && -n "$f2" ]] && mv "$f1/$f2" "$f2"
done < <(ls -1 */* | nl)
Вот скрипт не BASH:
ls -1 */* | nl | while read -r f1 f2; do
[ -n "$f1" ] && [ -n "$f2" ] && mv "$f1/$f2" "$f2"
done