Exec = строка из приложения определяет, что он может обрабатывать.
Пример: / usr/share/applications/gedit.desktop использует% U, что означает, что он может обрабатывать URL-адреса, поэтому gvfs будут использоваться
Подробнее см. Http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s06.html
На самом деле не настоящий однострочный:
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
На самом деле не настоящий однострочный:
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
На самом деле не настоящий однострочный:
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
Чтобы защитить от удаления пустых подкаталогов, 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
mv */* . && rmdir *
Переместить все в подкаталоги в текущие каталоги. rmdir не будет удалять каталоги, если они не пустые, поэтому вторая часть удаляет только пустые каталоги.
mv */* . && rmdir *
Переместить все в подкаталоги в текущие каталоги. rmdir не будет удалять каталоги, если они не пустые, поэтому вторая часть удаляет только пустые каталоги.
Чтобы защитить от удаления пустых подкаталогов, 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
mv */* . && rmdir *
Переместить все в подкаталоги в текущие каталоги. rmdir не будет удалять каталоги, если они не пустые, поэтому вторая часть удаляет только пустые каталоги.
Чтобы защитить от удаления пустых подкаталогов, 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