Как я могу найти файлы и затем использовать xargs для перемещения их?

Это, кажется мне ошибка в align.c 2.6.39 и предыдущий относительно GCC> = 4.6. Я предполагаю, что Вы основываетесь на недавнем Fedora, который имеет GCC 4.6, поскольку значение по умолчанию установило GCC. Ошибка не должна появляться использующий GCC <4.6, по моему скромному мнению.

Переменная "инструкция" объявляется на строке 704 и инициализируется для обнуления. Это затем повторно присвоено на строке 746. Этого переназначения недостаточно для подавления предупреждения gcc. Я проверил это поведение путем компиляции

int main()
{
    int i = 0;

    i = 4;
    return 1;
} 

с /usr/local/gcc-4.7.0/bin/gcc -Wall -o test test.c и добрался

test.c:3:6: warning: variable ‘i’ set but not used [-Wunused-but-set-variable]

На переменную "инструкцию" ссылаются только в коде, который является ifdef'ed CONFIG_VSX, так, чтобы, если у Вас нет набора CONFIG_VSX затем, Вы видели эту проблему при компиляции с GCC> = 4.6. Установка CONFIG_VSX должна решить проблему. Если это не то, что Вы хотите затем установку CONFIG_PPC_DISABLE_WERROR попытки в menuconfig или используете эти инструкции помочь Вам выключить-Werror или исправить код.

Если Вы действительно исправляете код, рассматриваете представление его на kernel.org, поскольку я вижу, что эта ошибка все еще существует в 3,3

28
16.09.2013, 17:12
5 ответов

Взгляд на ответ Stephane для лучшего метода, смотрите на мой ответ по причинам не использовать более очевидные решения (и причины, почему они не являются самыми эффективными).

Можно использовать -I опция xargs:

find /tmp/ -ctime -1 -name "x*" | xargs -I '{}' mv '{}' ~/play/

Который работает в подобном механизме к find и {}. Я также заключил бы Ваш в кавычки -name аргумент (потому что файл, запускающийся с x в существующем каталоге был бы файл-globed и передал как аргумент для нахождения - который не даст ожидаемое поведение!).

Однако, как указано manatwork, как детализировано в xargs страница справочника:

   -I replace-str
          Replace occurrences of replace-str in the initial-arguments with
          names read from standard input.  Also, unquoted  blanks  do  not
          terminate  input  items;  instead  the  separator is the newline
          character.  Implies -x and -L 1.

Важная вещь отметить является этим -L 1 средства, что только одна строка вывода от find будет обработан за один раз. Это означает, что это - синтаксически то же как:

find /tmp/ -ctime -1 -name "x*" -exec mv '{}' ~/play/

(который выполняет сингл mv операция для каждого файла).

Даже использование GNU -0 аргумент xargs и find -print0 аргумент вызывает точно то же поведение -I - это к clone() процесс для каждого файла mv:

find . -name "x*" -print0 | strace xargs -0 -I '{}' mv '{}' /tmp/other

.
.
read(0, "./foobar1/xorgslsala11\0./foobar1"..., 4096) = 870
mmap(NULL, 135168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =     0x7fbb82fad000
open("/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=26066, ...}) = 0
mmap(NULL, 26066, PROT_READ, MAP_SHARED, 3, 0) = 0x7fbb82fa6000
close(3)                                = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD,         child_tidptr=0x7fbb835af9d0) = 661
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 661
--- SIGCHLD (Child exited) @ 0 (0) ---
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD,         child_tidptr=0x7fbb835af9d0) = 662
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 662
--- SIGCHLD (Child exited) @ 0 (0) ---
.
.
.
43
27.01.2020, 19:39
  • 1
    Это предполагает, что имена файлов не содержат новую строку, одинарная кавычка, символы обратной косой черты или двойная кавычка. –  Stéphane Chazelas 16.09.2013, 18:31

С инструментами GNU:

find /tmp/ -ctime -1 -name 'x*' -print0 |
  xargs -r0 mv -t ~/play/

-t (--target) опцией является конкретный GNU. -print0, -r, -0, в то время как нестандартный и инициирующий в GNU также найдены в некоторых других реализациях как на некотором BSDs.

POSIXly:

find /tmp/ -ctime -1 -name 'x*' -exec sh -c '
  exec mv "$@" ~/play/' sh {} +

Оба выполненных как немногие mv команды по мере необходимости и работа безотносительно изображают имена файлов, может содержать. GNU можно иметь преимущество это find продолжает искать файлы в то время как mv начинает перемещать первый пакет.

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

17
27.01.2020, 19:39
  • 1
    , который намного лучше выполняет Это решение, так как это звонит mv однажды для всех аргументов (или для всего из -L или -n, если предоставлено). Иначе, вызов mv поскольку каждый файл станет старым (и медленный) быстро. –  r2evans 12.02.2018, 23:25

Возможно, сейчас эта команда возможна, а в 2013 году ее не было, но у меня она отлично работает:

ls pattern* | xargs mv -t DESTINATION/

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

16
27.01.2020, 19:39

Вы можете попробовать выполнить приведенную ниже команду и протестировать ее, и она работает нормально

find /tmp/ -ctime -1 -type f -name "x*" -exec mv -t ~/play/ {} \;
0
27.01.2020, 19:39

Я также хотел бы предложить несколько альтернативных инструментов. Конечно, findсуществует уже очень давно, так что это надежный инструмент, но я обнаружил, что fdнамного проще работать с :

.
fd -d1 -epdf -S+2m -x mv {} books/

Эта команда переместит все pdf-файлы размером более 2 МБ в текущем каталоге во вложенную папку с именем «книги».

Мне нравится fd, потому что он жалуется намного меньше, чем другие инструменты, такие как find+xargs, имеют больше пограничных случаев, о которых вам нужно знать больше. Например, если файл имеет одинарную кавычку в имени, то xargs будет иметь потенциально неожиданное поведение.

https://github.com/sharkdp/fd

1
03.08.2020, 11:37

Теги

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