LINUX.ORG.RU

Почему связка find xargs rdfind у меня не работает?

 , ,


1

0
rdfind -checksum sha256 -makehardlinks true /media/1/Steam*
Now scanning "/media/1/SteamLibrary", found 12266 files.
rdfind -checksum sha256 -makehardlinks true "/media/1/Steam*"
Now scanning "/media/1/Steam*", found 0 files.
find /media/ -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 -I {} rdfind -checksum sha256 -makehardlinks true {}/Steam*
Now scanning "/media/1/Steam*", found 0 files.
find /media/ -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 -I {} rdfind -checksum sha256 -makehardlinks true "{}/Steam*"
Now scanning "/media/1/Steam*", found 0 files.

Методом ненаучного тыка пытаешься задачу решать, не читая документации? Это неправильно.

Наводящий вопрос: чем * в командной строке отличается от "*"? Кто отвечает за разницу? Это во-первых.

Во-вторых: почему бы тебе не использовать команду echo, чтобы посмотреть с какими параметрами ты запускаешь rdfind? Например:

$ find /media/ -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 -I {} echo rdfind -checksum sha256 -makehardlinks true {}/Steam*

Может, вывод натолкнёт тебя на какие-нибудь полезные размышления. Всё лучше чем кавычки наобум там и сям расставлять.

debugger ★★★★★
()
Последнее исправление: debugger (всего исправлений: 2)
Ответ на: комментарий от Aceler

Это я и сам понял, но мне нужно чтобы нашлись каталоги по Steam* и не знаю как это сделать, поэтому сюда пришёл.
Так тоже ничего не получается

find /media/ -mindepth 1 -maxdepth 1 -type d -exec rdfind -checksum sha256 -makehardlinks true {}/Steam* \;
Now scanning "/media/1/Steam*", found 0 files.
bbgg
() автор топика

Почему связка find xargs rdfind у меня не работает?

Врёшь, работает

Твой косяк уже на втором шаге, задолго до того, как начинаешь использовать find

hint:

  • bash выполняет подстановку и раскрывает glob pattern только один раз
  • у find есть ключи -name и -iname
router ★★★★★
()
Ответ на: комментарий от router

У меня 2 компа, я не могу один профиль использовать, и вообще связь профиля с личностью и переход на личность давно пора выкинуть из мозга.

ext4
()
Последнее исправление: ext4 (всего исправлений: 1)
Ответ на: комментарий от ext4

переход на личность давно пора выкинуть из мозга

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

связь профиля с личностью … давно пора выкинуть из мозга

Почему?

kaldeon
()
Последнее исправление: kaldeon (всего исправлений: 1)
Ответ на: комментарий от ext4

Давай объясню проблему.

rdfind -checksum sha256 -makehardlinks true "/media/1/Steam*"
Now scanning "/media/1/Steam*", found 0 files.

Попробуй выполнить echo "/media/1/Steam*".

find /media/ -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 -I {} rdfind -checksum sha256 -makehardlinks true {}/Steam*
Now scanning "/media/1/Steam*", found 0 files.

{}/Steam* раскрывается шеллом перед исполнением команды и, в данном случае, перед попаданием в xargs. {} до xargs интерпретируется как обычная строка, никаких дополнительных смыслов в ней нет. Если по данному паттерну не было ничего найдено, а файла ./{}/Steam1 или ./{}/Steam2, вероятно, не существует, то по умолчанию вместо раскрытия используется сама строка «{}/Steam*» (буквально со звёздочкой в имени), а файла под названием «Steam*», вероятно, не существует.

find /media/ -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 -I {} rdfind -checksum sha256 -makehardlinks true "{}/Steam*"
Now scanning "/media/1/Steam*", found 0 files.

В данном случае кавычки предотвращают попытку раскрытия *, который всё равно не раскрылся бы.

kaldeon
()
Последнее исправление: kaldeon (всего исправлений: 4)
for i in /media/*; do
  [ -d "$i" ] || continue # пропускаем не-директории
  find "$i" -mindepth 1 -maxdepth 1 -type d -exec \
    rdfind -checksum sha256 -makehardlinks true {} + &
fi

Вряд-ли параллельность что-то ускорит, т.к. задача явно упирается в ввод-вывод, но дело твоё. Амперсенд убрать не долго.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Альтернативный вариант, который, возможно, будет более понятен:

for i in /media/*/; do
  ( cd "$i";
    rdfind -checksum sha256 -makehardlinks true ./*/ ) &
fi
legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

Кажется, дошло до меня, bash всё * считывает разом в текущем каталоге, а я ошибочно подумал он до первой * только читает один раз.

ext4
()
Последнее исправление: ext4 (всего исправлений: 1)
Ответ на: комментарий от ext4

Да. Но в случае с parallel -0 rdfind ... {}Steam* шелл не раскрывает * т.к. объекта с именем на {}Steam нет. Если бы был - скрипт бы не работал как ожидается. Но тут * раскрывает parallel. В досе и винде многие программы сами раскрывают *, но в юниксах это не принято.

legolegs ★★★★★
()