Выполнение этой команды в оболочке или добавление ее в конфигурационный файл оболочки добавит текущую директорию к переменной PATH. Переменная PATH - это список каталогов, в которых оболочка будет искать исполняемые файлы для выполнения при выдаче команды.
Это позволит вам запустить любой исполняемый файл в текущем каталоге без [1122438]./[12120] Я не уверен, что это лучше, чем делать это в памяти, но с sed
, который r
вытягивает свое вхождение для каждой строки в своем вхождении, а другой на другой стороне трубы, чередующейся H
старое пространство с входными линиями...
cat <<\IN >/tmp/tmp
Row1,10
Row2,20
Row3,30
Row4,40
IN
</tmp/tmp sed -e 'i\
' -e 'r /tmp/tmp' |
sed -n '/./!n;h;N;/\n$/D;G;s/\n/ /;P;D'
Row1,10 Row1,10
Row1,10 Row2,20
Row1,10 Row3,30
Row1,10 Row4,40
Row2,20 Row1,10
Row2,20 Row2,20
Row2,20 Row3,30
Row2,20 Row4,40
Row3,30 Row1,10
Row3,30 Row2,20
Row3,30 Row3,30
Row3,30 Row4,40
Row4,40 Row1,10
Row4,40 Row2,20
Row4,40 Row3,30
Row4,40 Row4,40
Я сделал это другим способом. Он хранит некоторые в памяти - он хранит последовательность типа:
"$1" -
... для каждой строки в файле.
pairs(){ [ -e "$1" ] || return
set -- "$1" "$(IFS=0 n=
case "${0%sh*}" in (ya|*s) n=-1;; (mk|po) n=+1;;esac
printf '"$1" - %s' $(printf "%.$(($(wc -l <"$1")$n))d" 0))"
eval "cat -- $2 </dev/null | paste -d ' \n' -- $2"
}
Это очень быстро. Файл cat
встречается столько раз, сколько строк в файле | pipe
. С другой стороны трубы, вводимые данные, объединяются с самим файлом столько раз, сколько линий в файле.
Материал case
предназначен только для переносимости - yash
и zsh
оба добавляют один элемент к разделению, в то время как mksh
и posh
оба теряют один. ksh
, тире
, busybox
и bash
все разделены на столько полей, сколько нулей напечатано printf
. Как написано выше, приводит к одинаковым результатам для каждого из вышеупомянутых корпусов на моей машине.
Если длина файла очень велика , может возникнуть $ ARGMAX
со слишком большим количеством аргументов, в этом случае потребуется ввести xargs
или аналогичные.
При условии, что тот же вход I, который использовался до выхода, идентичен. Но, если бы я стала больше...
seq 10 10 10000 | nl -s, >/tmp/tmp
Это создает файл, почти идентичный тому, что я использовал до (sans 'Row') - но в 1000 строках. Вы можете сами увидеть, насколько это быстро:
time pairs /tmp/tmp |wc -l
1000000
pairs /tmp/tmp 0.20s user 0.07s system 110% cpu 0.239 total
wc -l 0.05s user 0.03s system 32% cpu 0.238 total
На 1000 линиях есть некоторые небольшие различия в производительности между оболочками - bash
неизменно медленнее всего - но поскольку единственная работа, которую они делают в любом случае, это генерация arg последовательности (1000 копии имени файла -
) эффект минимален. Разница в производительности между zsh
- как выше - и bash
составляет здесь 100-ю секунду.
Вот еще одна версия, которая должна работать для файла любой длины:
pairs2()( [ -e "$1" ] || exit
rpt() until [ "$((n+=1))" -gt "$1" ]
do printf %s\\n "$2"
done
[ -n "${1##*/*}" ] || cd -P -- "${1%/*}" || exit
: & set -- "$1" "/tmp/pairs$!.ln" "$(wc -l <"$1")"
ln -s "$PWD/${1##*/}" "$2" || exit
n=0 rpt "$3" "$2" | xargs cat | { exec 3<&0
n=0 rpt "$3" p | sed -nf - "$2" | paste - /dev/fd/3
}; rm "$2"
)
Она создает мягкую ссылку на свой первый arg в /tmp
с полуслучайным именем, чтобы не зависать на странных именах файлов. Это важно, потому что перегоны cat
подаются в него по трубе через перегоны xargs
. Выходные данные cat
сохраняются в < & 3
, в то время как sed
p
печатает каждую строку в первом arg столько раз, сколько есть строк в этом файле - и его скрипт также подается в него через канал. Снова paste
объединяет свой вход, но на этот раз для стандартного входа и имени ссылки /dev/fd/3
требуется только два аргумента -
.
Последняя - ссылка /dev/fd/[ num]
- должна работать на любой системе Linux и многие другие, кроме того, но если она не создает именованный канал с mkfifo
и с помощью этого вместо этого должна работать.
Последнее, что он делает, это rm
мягкая связь, которую он создает перед выходом.
Эта версия на самом деле быстрее еще в моей системе. Я думаю, что это потому, что, хотя он выполняет больше приложений, он начинает передавать им их аргументы немедленно - в то время как прежде он сложил их все первыми.
time pairs2 /tmp/tmp | wc -l
1000000
pairs2 /tmp/tmp 0.30s user 0.09s system 178% cpu 0.218 total
wc -l 0.03s user 0.02s system 26% cpu 0.218 total
-121--31379- ed file.txt
%g/^/s// /
2,$g/^/-,.j
1s/^/command/
wq
chmod 755 file.txt
./file.txt
Возьмите все строки файла и передайте их в качестве аргументов одной команде, т.е.
command line1 line2 line3 ....
Если вам нужен флаг --option
перед каждой строкой, измените вторую команду на:
%g/^/s// --option /
-121--10129- По какой-нибудь тайне i Это был просто вопрос восстановления их с помощью метаданных я мог бы создать резервную копию с помощью testdisk
. Я скопировал исходную папку /etc/lvm
на рабочем столе живого пользователя, затем
$ pvcreate --uuid "cZ83jX-WXkk-tNG4-ulGT-sAqq-HlKq-Omtqc8" \
--restorefile /home/liveuser/Desktop/etc/lvm/archive/VG.vg /dev/sda2
Physical volume "/dev/sda2" successfully created
$ vgcfgrestore VG
Restored volume group VG
$ lvchange -ay /dev/VG/home /dev/VG/root /dev/VG/swap
$ lvs -a -o +devices
После этого vgdisplay -v fedora_pedro
вернул согласованные выходные данные, упомянув исходные логические и физические тома, которые мне было разрешено монтировать и исследовать. Но через пару минут я, к сожалению, протер заголовок контейнера Люкс, пытаясь записать эти изменения на диск. Так что все было сделано напрасно...