Как растворить все подпапки

Exec = строка из приложения определяет, что он может обрабатывать.

Пример: / usr/share/applications/gedit.desktop использует% U, что означает, что он может обрабатывать URL-адреса, поэтому gvfs будут использоваться

Подробнее см. Http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s06.html

4
задан 8 May 2017 в 12:34

9 ответов

На самом деле не настоящий однострочный:

find . -mindepth 2 -maxdepth 2 -print -exec mv --backup=numbered -t . '{}' + \
&& find . -mindepth 1 -maxdepth 1 -type d -empty -delete

Сначала найдите все в подпапке с точной глубиной 2 и переместите ее на .. Затем найдите и удалите все пустые папки в текущем каталоге.

, если у вас есть файлы / папки с тем же именем, они будут переименованы в original_filename.~n~ (n означает 1, 2, 3 ...). Обратите внимание, что удалите все пустые подпапки.

Обновление:

Я не доволен решением выше. Слишком много оговорок и проблем. Например, когда --backup = numbered переименовывает родительскую папку вашей папки, которую вы хотите переместить ...

mkdir -p test/test
mv test/test . --backup=numbered
mv: cannot move 'test/test' to './test': No such file or directory

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

tmpdir=$(mktemp -d)
find . -mindepth 2 -maxdepth 2 -print -exec mv -b -t $tmpdir '{}' +
find . -mindepth 1 -maxdepth 1 -type d -empty -delete
mv -b $tmpdir/* .
rm $tmpdir
5
ответ дан 22 May 2018 в 22:49
  • 1
    Существует небольшое предостережение, которое также удалит пустые подпапки второго уровня. – oulenz 8 May 2017 в 12:37
  • 2
    Что вы подразумеваете под ~n~? – oulenz 8 May 2017 в 12:37
  • 3
    Нет, он просто удалит пустые папки в & quot ;. " См. -mindepth / -maxdepth. – RoVo 8 May 2017 в 12:39
  • 4
    --exec mv --backup=numbered -t . {} +, чтобы find выполнял команды mv. – muru 8 May 2017 в 12:41
  • 5
    @RoVo да, но как только эти пустые подпапки второго уровня были перемещены в ., не будут ли они зависеть от второго оператора, который удалит все пустые подпапки? – oulenz 8 May 2017 в 13:03

На самом деле не настоящий однострочный:

find . -mindepth 2 -maxdepth 2 -print -exec mv --backup=numbered -t . '{}' + \ && find . -mindepth 1 -maxdepth 1 -type d -empty -delete

Сначала найдите все в подпапке с точной глубиной 2 и переместите ее на .. Затем найдите и удалите все пустые папки в текущем каталоге.

, если у вас есть файлы / папки с тем же именем, они будут переименованы в original_filename.~n~ (n означает 1, 2, 3 ...). Обратите внимание, что удалите все пустые подпапки.

Обновление:

Я не доволен решением выше. Слишком много оговорок и проблем. Например, когда --backup = numbered переименовывает родительскую папку вашей папки, которую вы хотите переместить ...

mkdir -p test/test mv test/test . --backup=numbered mv: cannot move 'test/test' to './test': No such file or directory

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

tmpdir=$(mktemp -d) find . -mindepth 2 -maxdepth 2 -print -exec mv -b -t $tmpdir '{}' + find . -mindepth 1 -maxdepth 1 -type d -empty -delete mv -b $tmpdir/* . rm $tmpdir
5
ответ дан 18 July 2018 в 13:39

На самом деле не настоящий однострочный:

find . -mindepth 2 -maxdepth 2 -print -exec mv --backup=numbered -t . '{}' + \ && find . -mindepth 1 -maxdepth 1 -type d -empty -delete

Сначала найдите все в подпапке с точной глубиной 2 и переместите ее на .. Затем найдите и удалите все пустые папки в текущем каталоге.

, если у вас есть файлы / папки с тем же именем, они будут переименованы в original_filename.~n~ (n означает 1, 2, 3 ...). Обратите внимание, что удалите все пустые подпапки.

Обновление:

Я не доволен решением выше. Слишком много оговорок и проблем. Например, когда --backup = numbered переименовывает родительскую папку вашей папки, которую вы хотите переместить ...

mkdir -p test/test mv test/test . --backup=numbered mv: cannot move 'test/test' to './test': No such file or directory

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

tmpdir=$(mktemp -d) find . -mindepth 2 -maxdepth 2 -print -exec mv -b -t $tmpdir '{}' + find . -mindepth 1 -maxdepth 1 -type d -empty -delete mv -b $tmpdir/* . rm $tmpdir
5
ответ дан 24 July 2018 в 20:13

Чтобы защитить от удаления пустых подкаталогов, IMO самым простым способом является переход во временный каталог, а затем переименование временного каталога на старый. Скажем, что указанная директория foo, и вы хотите foo/*/* стать foo/*. Сделайте что-то вроде:

tar c --remove-files foo | tar xv --strip-components=2 --backup=t --one-top-level=temp
mv temp foo
С помощью --remove-files первый tar удалит файлы по мере их обработки, наконец, удалив foo. С помощью --strip-components=2 второй tar будет отжимать foo/*/ из путей, которые он извлекает, поэтому foo/a/b станет b. --backup=t совпадает с cp или mv - делать пронумерованные резервные копии. Однако mv делает копии каталогов, если они имеют одинаковое имя, но tar объединяет каталоги и создает резервные копии файлов. --one-top-level=temp сообщает tar создать каталог с именем temp и извлечь туда файлы.

Например:

$ tree bar
bar
├── a
│   ├── c
│   │   └── bar
│   ├── d
│   │   └── bar
│   ├── e
│   │   └── bar
│   └── f
│       └── bar
├── b
│   ├── c
│   │   └── bar
│   ├── d
│   │   └── bar
│   ├── e
│   │   └── bar
│   └── f
│       └── bar
└── c
    ├── c
    │   └── bar
    ├── d
    │   └── bar
    ├── e
    │   └── bar
    └── f
        └── bar

И после запуска команд tar:

$ tar c --remove-files bar | tar xv --strip-components=2 --backup=t --one-top-level=temp
bar/a/e/
bar/a/e/bar
bar/a/f/
bar/a/f/bar
bar/a/c/
bar/a/c/bar
bar/a/d/
bar/a/d/bar
bar/b/e/
bar/b/e/bar
Renaming ‘temp/e/bar’ to ‘temp/e/bar.~1~’
bar/b/f/
bar/b/f/bar
Renaming ‘temp/f/bar’ to ‘temp/f/bar.~1~’
bar/b/c/
bar/b/c/bar
Renaming ‘temp/c/bar’ to ‘temp/c/bar.~1~’
bar/b/d/
bar/b/d/bar
Renaming ‘temp/d/bar’ to ‘temp/d/bar.~1~’
bar/c/e/
bar/c/e/bar
Renaming ‘temp/e/bar’ to ‘temp/e/bar.~2~’
bar/c/f/
bar/c/f/bar
Renaming ‘temp/f/bar’ to ‘temp/f/bar.~2~’
bar/c/c/
bar/c/c/bar
Renaming ‘temp/c/bar’ to ‘temp/c/bar.~2~’
bar/c/d/
bar/c/d/bar
Renaming ‘temp/d/bar’ to ‘temp/d/bar.~2~’

$ tree temp
temp
├── c
│   ├── bar
│   ├── bar.~1~
│   └── bar.~2~
├── d
│   ├── bar
│   ├── bar.~1~
│   └── bar.~2~
├── e
│   ├── bar
│   ├── bar.~1~
│   └── bar.~2~
└── f
    ├── bar
    ├── bar.~1~
    └── bar.~2~

4 directories, 12 files

С выходом tar вы можете видеть, когда tar переименовали файлы для резервного копирования, позволяя вам отслеживать, какие файлы стали резервной копией.

Я слегка удивлен, что он работает, но вы можете фактически указать одно и то же имя каталога для --one-top-level и устранить необходимость переименования. Только этого конвейера достаточно:

tar c --remove-files bar | tar xv --strip-components=2 --backup=t --one-top-level=bar
1
ответ дан 22 May 2018 в 22:49
mv */* . && rmdir *

Переместить все в подкаталоги в текущие каталоги. rmdir не будет удалять каталоги, если они не пустые, поэтому вторая часть удаляет только пустые каталоги.

-1
ответ дан 22 May 2018 в 22:49
mv */* . && rmdir *

Переместить все в подкаталоги в текущие каталоги. rmdir не будет удалять каталоги, если они не пустые, поэтому вторая часть удаляет только пустые каталоги.

-1
ответ дан 18 July 2018 в 13:39

Чтобы защитить от удаления пустых подкаталогов, IMO самым простым способом является переход во временный каталог, а затем переименование временного каталога на старый. Скажем, что указанная директория foo, и вы хотите foo/*/* стать foo/*. Сделайте что-то вроде:

tar c --remove-files foo | tar xv --strip-components=2 --backup=t --one-top-level=temp mv temp foo С помощью --remove-files первый tar удалит файлы по мере их обработки, наконец, удалив foo. С помощью --strip-components=2 второй tar будет отжимать foo/*/ из путей, которые он извлекает, поэтому foo/a/b станет b. --backup=t совпадает с cp или mv - делать пронумерованные резервные копии. Однако mv делает копии каталогов, если они имеют одинаковое имя, но tar объединяет каталоги и создает резервные копии файлов. --one-top-level=temp сообщает tar создать каталог с именем temp и извлечь туда файлы.

Например:

$ tree bar bar ├── a │   ├── c │   │   └── bar │   ├── d │   │   └── bar │   ├── e │   │   └── bar │   └── f │   └── bar ├── b │   ├── c │   │   └── bar │   ├── d │   │   └── bar │   ├── e │   │   └── bar │   └── f │   └── bar └── c ├── c │   └── bar ├── d │   └── bar ├── e │   └── bar └── f └── bar

И после запуска команд tar:

$ tar c --remove-files bar | tar xv --strip-components=2 --backup=t --one-top-level=temp bar/a/e/ bar/a/e/bar bar/a/f/ bar/a/f/bar bar/a/c/ bar/a/c/bar bar/a/d/ bar/a/d/bar bar/b/e/ bar/b/e/bar Renaming ‘temp/e/bar’ to ‘temp/e/bar.~1~’ bar/b/f/ bar/b/f/bar Renaming ‘temp/f/bar’ to ‘temp/f/bar.~1~’ bar/b/c/ bar/b/c/bar Renaming ‘temp/c/bar’ to ‘temp/c/bar.~1~’ bar/b/d/ bar/b/d/bar Renaming ‘temp/d/bar’ to ‘temp/d/bar.~1~’ bar/c/e/ bar/c/e/bar Renaming ‘temp/e/bar’ to ‘temp/e/bar.~2~’ bar/c/f/ bar/c/f/bar Renaming ‘temp/f/bar’ to ‘temp/f/bar.~2~’ bar/c/c/ bar/c/c/bar Renaming ‘temp/c/bar’ to ‘temp/c/bar.~2~’ bar/c/d/ bar/c/d/bar Renaming ‘temp/d/bar’ to ‘temp/d/bar.~2~’ $ tree temp temp ├── c │   ├── bar │   ├── bar.~1~ │   └── bar.~2~ ├── d │   ├── bar │   ├── bar.~1~ │   └── bar.~2~ ├── e │   ├── bar │   ├── bar.~1~ │   └── bar.~2~ └── f ├── bar ├── bar.~1~ └── bar.~2~ 4 directories, 12 files

С выходом tar вы можете видеть, когда tar переименовали файлы для резервного копирования, позволяя вам отслеживать, какие файлы стали резервной копией.

Я слегка удивлен, что он работает, но вы можете фактически указать одно и то же имя каталога для --one-top-level и устранить необходимость переименования. Только этого конвейера достаточно:

tar c --remove-files bar | tar xv --strip-components=2 --backup=t --one-top-level=bar
1
ответ дан 18 July 2018 в 13:39
mv */* . && rmdir *

Переместить все в подкаталоги в текущие каталоги. rmdir не будет удалять каталоги, если они не пустые, поэтому вторая часть удаляет только пустые каталоги.

-1
ответ дан 24 July 2018 в 20:13

Чтобы защитить от удаления пустых подкаталогов, IMO самым простым способом является переход во временный каталог, а затем переименование временного каталога на старый. Скажем, что указанная директория foo, и вы хотите foo/*/* стать foo/*. Сделайте что-то вроде:

tar c --remove-files foo | tar xv --strip-components=2 --backup=t --one-top-level=temp mv temp foo С помощью --remove-files первый tar удалит файлы по мере их обработки, наконец, удалив foo. С помощью --strip-components=2 второй tar будет отжимать foo/*/ из путей, которые он извлекает, поэтому foo/a/b станет b. --backup=t совпадает с cp или mv - делать пронумерованные резервные копии. Однако mv делает копии каталогов, если они имеют одинаковое имя, но tar объединяет каталоги и создает резервные копии файлов. --one-top-level=temp сообщает tar создать каталог с именем temp и извлечь туда файлы.

Например:

$ tree bar bar ├── a │   ├── c │   │   └── bar │   ├── d │   │   └── bar │   ├── e │   │   └── bar │   └── f │   └── bar ├── b │   ├── c │   │   └── bar │   ├── d │   │   └── bar │   ├── e │   │   └── bar │   └── f │   └── bar └── c ├── c │   └── bar ├── d │   └── bar ├── e │   └── bar └── f └── bar

И после запуска команд tar:

$ tar c --remove-files bar | tar xv --strip-components=2 --backup=t --one-top-level=temp bar/a/e/ bar/a/e/bar bar/a/f/ bar/a/f/bar bar/a/c/ bar/a/c/bar bar/a/d/ bar/a/d/bar bar/b/e/ bar/b/e/bar Renaming ‘temp/e/bar’ to ‘temp/e/bar.~1~’ bar/b/f/ bar/b/f/bar Renaming ‘temp/f/bar’ to ‘temp/f/bar.~1~’ bar/b/c/ bar/b/c/bar Renaming ‘temp/c/bar’ to ‘temp/c/bar.~1~’ bar/b/d/ bar/b/d/bar Renaming ‘temp/d/bar’ to ‘temp/d/bar.~1~’ bar/c/e/ bar/c/e/bar Renaming ‘temp/e/bar’ to ‘temp/e/bar.~2~’ bar/c/f/ bar/c/f/bar Renaming ‘temp/f/bar’ to ‘temp/f/bar.~2~’ bar/c/c/ bar/c/c/bar Renaming ‘temp/c/bar’ to ‘temp/c/bar.~2~’ bar/c/d/ bar/c/d/bar Renaming ‘temp/d/bar’ to ‘temp/d/bar.~2~’ $ tree temp temp ├── c │   ├── bar │   ├── bar.~1~ │   └── bar.~2~ ├── d │   ├── bar │   ├── bar.~1~ │   └── bar.~2~ ├── e │   ├── bar │   ├── bar.~1~ │   └── bar.~2~ └── f ├── bar ├── bar.~1~ └── bar.~2~ 4 directories, 12 files

С выходом tar вы можете видеть, когда tar переименовали файлы для резервного копирования, позволяя вам отслеживать, какие файлы стали резервной копией.

Я слегка удивлен, что он работает, но вы можете фактически указать одно и то же имя каталога для --one-top-level и устранить необходимость переименования. Только этого конвейера достаточно:

tar c --remove-files bar | tar xv --strip-components=2 --backup=t --one-top-level=bar
1
ответ дан 24 July 2018 в 20:13

Другие вопросы по тегам:

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