Как Вы отправляете вывод ls к mv?

в iOS 8 : так я делаю, чтобы получить ScreenShot

  1. , только что добавил один UIImageView и метод, чтобы сделать скриншот в .h file

@property (слабый, неатомный) IBOutlet UIImageView * imageView;

 -(IBAction)takeSnapShot:(id)sender;

2 добавлен фрагмент кода для создания снимка экрана и установите на UIImageView в файле .m

- (IBAction)takeSnapShot:(id)sender
{
    UIGraphicsBeginImageContext(self.view.bounds.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *snapShotImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    imageView.image = snapShotImage;
}
  1. ниже - вывод, который я получил.

enter image description here

38
задан LJNielsenDk 26 April 2013 в 08:00
поделиться

11 ответов

Один из способов - использовать обратные кавычки:

mv `ls *.boo` subdir

Изменить : однако это хрупкий и не рекомендуется - см. Ответ @ lhunath для подробных объяснений и рекомендаций.

21
ответ дан 27 November 2019 в 03:11
поделиться

Не совсем уверен, чего вы здесь пытаетесь достичь, но вот одна возможность:

Часть «xargs» - важная часть, все остальное просто настраивается. Эффект от этого состоит в том, чтобы взять все, что выводит «ls», и добавить к нему расширение «.txt».

$ mkdir xxx  # 
$ cd xxx
$ touch a b c x y z
$ ls
a  b  c  x  y  z
$ ls | xargs -Ifile mv file file.txt
$ ls
a.txt  b.txt  c.txt  x.txt  y.txt  z.txt
$

Нечто подобное также может быть достигнуто с помощью:

$ touch a b c x y z
$ for i in `ls`;do mv $i ${i}.txt; done
$ ls
a.txt  b.txt  c.txt  x.txt  y.txt  z.txt
$

Мне больше нравится второй способ. Я НИКОГДА не могу вспомнить, как работает xargs , не прочитав страницу руководства или не открыв мой файл "милых трюков".

Надеюсь, это поможет.

5
ответ дан 27 November 2019 в 03:11
поделиться

Check out find -exec {} as it might be a better option than ls but it depends on what you're trying to achieve.

5
ответ дан 27 November 2019 в 03:11
поделиться

Ни один из ответов пока не является безопасным для имен файлов с пробелами. Попробуйте следующее:

for i in *; do mv "$i" some_dir/; done

Вы, конечно, можете использовать любой шаблон глобуса вместо * .

4
ответ дан 27 November 2019 в 03:11
поделиться

Вы заключаете ls в обратные кавычки и помещаете его после mv, вот так ...

mv `ls` somewhere/

Но имейте в виду, что если в каком-либо из имен ваших файлов есть пробелы, он выиграет работает не очень хорошо.

Также было бы проще сделать что-то вроде этого: mv filepattern * where /

-2
ответ дан 27 November 2019 в 03:11
поделиться

Обратные кавычки работают хорошо, как предлагали другие. См. Также xargs. А для действительно сложных вещей передайте его в sed, составьте список нужных команд, затем снова запустите его с выводом sed, переданным в sh.

Вот пример с find, но он также отлично работает с ls:

http://github.com/DonBranson/scripts/blob/f09d24629ab6eb3ce509d4d3078818430306b063/jarfinder.sh

0
ответ дан 27 November 2019 в 03:11
поделиться

ls - это инструмент, используемый для ОТОБРАЖЕНИЯ некоторой статистики об именах файлов в каталоге.

Это не инструмент, который вы должны использовать для их перечисления и передачи их к другому инструменту для использования там. Парсинг ls почти всегда неправильный поступок, и в нем есть много ошибок.

Для получения подробного документа о вреде синтаксического анализа ls, который вам следует ] действительно прочтите, проверьте: http://mywiki.wooledge.org/ParsingLs

Вместо этого вы должны использовать либо глобусы, либо найти, в зависимости от того, чего именно вы пытаетесь достичь:

mv * /foo
find . -exec mv {} /foo \;

Основной источник плохого анализа ls заключается в том, что ls выгружает все имена файлов в одну строку вывода, и нет способа отличить имена файлов оттуда. Насколько вы знаете, весь вывод ls может представлять собой одно имя файла!

Вторичный источник плохого анализа ls происходит из-за того, что половина мира использует bash. Они думают, что for волшебным образом делает то, что они хотели бы, когда они делают что-то вроде:

for file in `ls`  # Never do this!
for file in $(ls) # Exactly the same thing.

for - это встроенная функция bash, которая перебирает аргументы. И $ (ls) берет вывод ls и разделяет его на аргументы везде, где есть пробелы , символы новой строки или вкладки . Это в основном означает, что вы перебираете слов , а не имен файлов . Хуже того, вы просите греться, чтобы взять каждое из этих искаженных слов имени файла, а затем рассматривать их как глобусы, которые могут соответствовать именам файлов в текущем каталоге. Поэтому, если у вас есть имя файла, которое содержит слово, которое оказывается глобусом, совпадающим с другими именами файлов в текущем каталоге, это слово исчезнет, ​​и все соответствующие имена файлов появятся вместо него!

mv `ls` /foo      # Exact same badness as the ''for'' thing.
74
ответ дан 27 November 2019 в 03:11
поделиться

Вы не должны использовать вывод ls как ввод другой команды. Файлы с пробелами в именах сложны, как и включение управляющих последовательностей ANSI, если у вас есть:

alias ls-'ls --color=always'

, например.

Всегда используйте find или xargs (с -0) или подстановку.

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

edit: добавлено -0 в xargs (спасибо за напоминание)

1
ответ дан 27 November 2019 в 03:11
поделиться

Просто используйте find или подстановку ваших оболочек!

find . -depth=1 -exec mv {} /tmp/blah/ \;

.. или ..

mv * /tmp/blah/

Вам не нужно беспокоиться о цвете в выводе ls, или другая странность конвейера - Linux допускает практически любые символы в имени файла, кроме нулевого байта .. Например:

$ touch "blah\new|
> "
$ ls | xargs file
blahnew|:                  cannot open `blahnew|' (No such file or directory)

.. но find работает отлично:

$ find . -exec file {} \;
./blah\new|
: empty
-1
ответ дан 27 November 2019 в 03:11
поделиться
/bin/ls | tr '\n' '\0' | xargs -0 -i% mv % /path/to/destdir/

"Useless use of ls", but should work. By specifying the full path to ls(1) you avoid clashes with aliasing of ls(1) mentioned in some of the previous posts. The tr(1) command together with "xargs -0" makes the command work with filenames containing (ugh) whitespace. It won't work with filenames containing newlines, but having filenames like that in the file system is to ask for trouble, so it probably won't be a big problem. But filenames with newlines could exist, so a better solution would be to use "find -print0":

find /path/to/srcdir -type f -print0 | xargs -0 -i% mv % dest/
0
ответ дан 27 November 2019 в 03:11
поделиться
#!/bin/bash

for i in $( ls * );
do
mv $1 /backup/$1
done

иначе, это решение поиска с помощью sybreon, а, как предлагается, НЕ зеленое решение mv ls.

-2
ответ дан 27 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

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