#!/bin/sh
for pathname in Foo/Bar1/File*; do
filename=${pathname##*/}
cat "$pathname" \
"Foo/Bar2/$filename" \
"Foo/Bar3/$filename" >"combined/all_$filename"
done
Это зациклило бы на всех файлах, чьи имена соответствуют File*
вFoo/Bar1
(мы предполагаем, что шаблон точно соответствует именам, которые нас действительно интересуют ).
Для каждого такого файла мы извлекаем часть имени файла из пути, что дает$filename
(это также можно было бы сделать с помощьюfilename=$(basename "$pathname")
). Затем мы объединяем исходный файл с соответствующими файлами в каталогах Foo/Bar2
и Foo/Bar3
, записывая результат в новый файл all_$filename
в каком-либо другом каталоге.
С небольшой проверкой ошибок:
#!/bin/sh
for pathname in Foo/Bar1/File*; do
if [ ! -f "$pathname" ]; then
printf '% is not a regular file, skipping\n' "$pathname" >&2
continue
fi
filename=${pathname##*/}
if [ -f "Foo/Bar2/$filename" ] &&
[ -f "Foo/Bar3/$filename" ]
then
cat "$pathname" \
"Foo/Bar2/$filename" \
"Foo/Bar3/$filename" >"combined/all_$filename"
else
printf 'Missing %s or %s\n' "Foo/Bar2/$filename" "Foo/Bar3/$filename" >&2
fi
done
Вариант, который также позволяет использовать различное количество BarN
подкаталогов. Предполагается , что каждый BarN
каталог нумеруется последовательно от 1 до некоторого большого числа.
#!/bin/sh
# This is just used to count the number of BarN subdirectories.
# The number of these will be $#.
set -- Foo/Bar*/
for pathname in Foo/Bar1/File*; do
filename=${pathname##*/}
n=1
while [ "$n" -le "$#" ]; do
if [ ! -f "Foo/Bar$n/$filename" ]; then
printf '%s missing, %s will be incomplete\n' \
"Foo/Bar$n/$filename" "combined/all_$filename" >&2
break
fi
cat "Foo/Bar$n/$filename"
n=$(( n + 1 ))
done >"combined/all_$filename"
done
Исходный ответ от https://askubuntu.com/q/1242009/747557, кредит @Hmdbbgh. Решение, которое сработало для меня, заключалось в переустановке python3 -apt :
.sudo apt remove python3-apt
sudo apt autoremove
sudo apt autoclean
sudo apt install python3-apt