Удалите файлы в каталоге, которые находятся также в другом каталоге

От Linus Torvalds: "Программное обеспечение похоже на пол: лучше, когда это свободно".

6
31.08.2011, 16:37
3 ответа

Хорошо, это - в основном то же как ответ klapauciu. (И это не возместит ущерба, нанесенного если cp перезаписал некоторые существующие файлы.)

Принятие Вас находится в исходном каталоге (в dir). Эта команда:

find . -type f echo '{}' ';'

перечислит все файлы (рекурсивно) существующие в Вашем dir каталог (вполне как -print). -type f опция там для предотвращения списка подкаталогов.

Так, если Вы используете:

find dir -type f -exec echo '../../../{}' ';'

Это должно перечислить соответствующие файлы (копии) в целевом каталоге.

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

find dir -type f -exec rm -- '../../../{}' ';'

Что касается сокращения остающихся пустых каталогов, которые прибывают из cp… гудят …

6
27.01.2020, 20:24
  • 1
    я использую echo метод для проверения имен файлов дважды сначала. Однако я должен измениться dir кому: . или иначе это, кажется, не работает. Кроме того, это только перечисляет файлы в dir, не те также в ../.. –  n0pe 31.08.2011, 16:11
  • 2
    я использую echo метод для проверения имен файлов дважды сначала. Однако я должен измениться dir кому: . или иначе это, кажется, не работает. Кроме того, это только перечисляет файлы в dir, не те также в ../.. ---------121 А-ч--------93506----да, я запутался Вашим описанием. Почему сделал cp скопировать содержание а не каталог в этом случае? А-ч –  Stéphane Gimenez 31.08.2011, 16:16
  • 3
    ! это - причина финала /! –  Stéphane Gimenez 31.08.2011, 16:24
  • 4
    тот в ./dir/? Если это было ./dir вместо этого? –  n0pe 31.08.2011, 16:27
  • 5
    Да, но это происходит только с некоторыми cp версии это кажется … Шахтой (coreutils 8.12), больше не имеют этого поведения. (Это иногда было полезно.) –  Stéphane Gimenez 31.08.2011, 16:31

Использовать find в сочетании с -exec. Лучший тест с ls прежде как это:

find . -name "*" -exec ls ../../{} \;
2
27.01.2020, 20:24
  • 1
    Что точно это делает? Для каждого файла в . (скопированный dir), это видит, являются ли это также два каталога? Для удаления их, я использую rm вместо ls? –  n0pe 31.08.2011, 15:24
  • 2
    Да, точно. Извините, забыл объяснять это –  klapaucius 31.08.2011, 15:34
  • 3
    Не волнуйтесь об этом, я протестирую это сначала прежде, чем попробовать его на моем сервере :) –  n0pe 31.08.2011, 15:41
  • 4
    , который я получаю find: missing argument to '-exec' –  n0pe 31.08.2011, 15:45
  • 5
    Сделайте у Вас есть пробел между {} и \;? –  klapaucius 31.08.2011, 15:57

Следующий код обрабатывает имена файлов, которые содержат встроенные новые строки, я поместил сценарий полной версии на paste.ubuntu. Это проверяет на существование и соответствие размерам... Код для генерации данных тестирования также включен там.

# This lists the original fully-qualified filename, 
# and its would-be counterpart (assuming it exists) 
unset a i
while IFS= read -r -d $'\0' relf; do
    printf "%s\n$s" "$PWD${relf:1}" "$(dirname "$(dirname "$PWD")")${relf:1}"
done < <(find  . -type f  \! -name '.' -name '*' -print0)

Вот демонстрационный вывод (упомянутой выше) полной версии, где один файл отсутствует, и у другого есть другой размер файла к оригиналу

WARNING -----
NOT in target   ./file1
ok --------
sizes match     ./c/file4-in-subdir
WARNING ------
size mis-match  ./file3   is   triple-spaced
ok --------
sizes match     ./file2
has newline!
2
27.01.2020, 20:24

Теги

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