sed -e '
s/\(\x02\)\1\1*//g; # erase 2 or more consecutive STX chars
s/\x02\([^I]\)/\1/g; # erase the STX only if followed by a non-I char
' yourfile
Если ваша команда будет работать, если командная строка не станет слишком длинной, вы можете использовать (сложный) xargs
следующим образом:
ls /home/jeremy/source | tail -1000 | xargs mv -t /home/jeremy/dest
Предполагается, что в именах файлов нет новых строк и других специальных символов. (или путь), иначе tail не будет работать должным образом, и xargs получит разделенные имена файлов (так как он работает со строками, если вы не укажете xargs -0
).
Аргумент -t
для mv
позволяет указать целевой каталог перед аргументами файла, которые необходимо скопировать в целевой.
В последних [1] версиях GNU findutils
и coreutils
:
find /home/jeremy/source -print0 |
tail -z -n 1000 |
xargs -0 -r mv -t /home/jeremy/dest/
The -print0
, Параметры -z
и -0
указывают всем трем инструментам использовать символ NUL в качестве разделителя имени файла / записи. Это делает безопасным использование этого конвейера с именами файлов, содержащими ЛЮБОЙ символ.
Если ваша версия tail
(или head
) не поддерживает параметр -z
, вы можете использовать новую строку в качестве разделителя имени файла (что будет будьте осторожны для ЛЮБОГО имени файла, кроме тех, которые содержат символы новой строки):
find /home/jeremy/source |
tail -n 1000 |
xargs -r -d '\n' mv -t /home/jeremy/dest/
BTW, xargs
совсем не сложно. Это довольно простая команда, которая берет данные из стандартного ввода и использует их для запуска программ (при этом данные из стандартного ввода используются в качестве аргументов в командной строке этой программы). Это полезный инструмент, который стоит того небольшого количества времени, которое требуется для изучения.
Что еще более важно, в отличие от $ (ls ...)
и подобных, использование xargs
позволяет избежать большинства (все, если вы используете NUL в качестве разделителя) проблем с пробелами, подстановочными символами оболочки ( подстановочные знаки и т. д.) и другие раздражающие символы (которые являются вполне допустимыми символами в именах файлов, поэтому хорошо написанный сценарий позаботится о том, чтобы они не были нарушены).
[1] Я точно не знаю, когда head
и tail
получили параметры -z
, но за последние несколько лет многие инструменты GNU (включая sort
) получили возможность использовать NUL в качестве разделителя входных записей. До этого было всего несколько инструментов вроде find
и xargs
.
Это чрезвычайно полезно, так как теперь вы можете использовать эти параметры -z
или -Z
или -0
и т. Д. Для создания длинных сложных конвейеров без каких-либо необходимость потерять это полезное NUL-разделение.