я нашел решение своей проблемы на переполнение стека . Таким образом:
Согласно это ридми , systemd, по-видимому, требует опция CONFIG_FHANDLE
ядра. После перекомпиляции с этой включенной опцией, монтируя разделы хорошо работал снова.
Для людей, использующих , делают menuconfig
, опция находится под Общая установка :
Насколько я понимаю, вы хотите изменить серию файлов на месте. Вы хотите удалить все, включая первую строку, которая состоит из всего из Abstract
. Если эти файлы находятся в текущем каталоге и все названы с расширением .txt
, используйте:
sed -i '0,/^Abstract$/d' *.txt
Так как это перезапишет старые файлы и в случае, если что-то пойдет не так, не используйте это без имея резервную копию.
Для этого может потребоваться GNU sed
(стандартная для Linux).
-i
Параметр -i
указывает sed
редактировать файлы на месте. Старый файл будет перезаписан.
0, / ^ Abstract $ / d
Эта команда сообщает sed
удалить ( d
) все строки с первой (номер 0) до первой включительно строка, соответствующая регулярному выражению ^ Abstract $
. Каретка ^
соответствует началу строки, а знак доллара соответствует ее концу. Таким образом, это регулярное выражение соответствует строке, содержащей только , слово Abstract
с без других символов в строке.
*. Txt
Указывает оболочке выбрать все файлы в текущем каталоге с суффиксом .txt
.
Это приведет к удалению всех строк в каждом файле до первой строки, которая начинается с Аннотация
:
sed -i '0,/^Abstract/d' *.txt
Поскольку $
был удален, это регулярное выражение требует только, чтобы строка начиналась с Abstract
.
Использование sed
:
sed -ni.bak '/^Abstract/,$p' *.txt
Получить все строки, которые начинаются с ^
с Abstract
в ,
end $
] файла и сохраните копию исходного файла с именем *. txt.bak
, используя параметр sed -i
.
С awk
:
awk '/^Abstract/,0' *.txt
Если вы хотите, чтобы это было также для подкаталога, используйте команду с командой find
следующим образом:
find /path/to/main-dir -type f -name "*.txt" -exec sed -ni.bak '/^Abstract/,$p' '{}';
Это намного лучше, если у вас есть новый строка в именах файлов:
find /path/to/main-dir -type f -name "*.txt" -print0 | while IFS= read -d '' -r file
do
sed -ni.bak '/^Abstract/,$p' "$file";
done
В данном решении ( find -name * txt -type d -exec sed -i '0, / ^ Abstract / d' * .txt {} \;
) в В теле вашего вопроса вы ищете каталоги ( -тип d
, используемый для поиска каталогов), имена которых заканчиваются на txt
, если у вас нет каталога с таким же именем, как ] * txt
, тогда ваша часть -exec
не запустится. Таким образом, вы ничего не делаете с этой командой.
Таким образом, вам нужно изменить * txt -type d
на «*. Txt» -type f
(это означает все файлы * .txt -type f
) и заключите их в кавычки, если в именах ваших файлов есть пробелы. Также вам необходимо удалить *. Txt
из конца команды sed
, потому что '{}'
в команде find указывает на текущий найденный файл и цитирует его тоже. Даже было бы лучше, если бы вы указали путь для поиска в команде. Наконец, ваша проверенная команда будет иметь следующий вид:
find /path/to/main-dir -name "*.txt" -type f -exec sed -i '0,/^Abstract/d' '{}' \;