как переместить набор файлов в one-liner [duplicate]

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
1
29.04.2016, 15:23
2 ответа

Если ваша команда будет работать, если командная строка не станет слишком длинной, вы можете использовать (сложный) xargs следующим образом:

 ls /home/jeremy/source | tail -1000 | xargs mv -t /home/jeremy/dest

Предполагается, что в именах файлов нет новых строк и других специальных символов. (или путь), иначе tail не будет работать должным образом, и xargs получит разделенные имена файлов (так как он работает со строками, если вы не укажете xargs -0 ).

Аргумент -t для mv позволяет указать целевой каталог перед аргументами файла, которые необходимо скопировать в целевой.

1
27.01.2020, 23:35

В последних [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-разделение.

1
27.01.2020, 23:35

Теги

Похожие вопросы