переместить файлы из текущего каталога в подкаталог

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

find . -type f -name '*.json' -prune -type f | xargs mv -t JSONS/

, он не работает, потому что путь неверен. Он хочет переместить файлы в ./JSONS/. Итак, как мне переместить файлы в их каталоге в подкаталог?

ОТ

├── subdirectory-A
│   ├── 1.mp4
│   ├── 1.json
│   ├── 2.mp4
│   ├── 2.json
│   ├── 3.mp4
│   └── 4.json
└── subdirectory-B
    └── subdirectory-C
        ├── 1.mp4
        ├── 1.json
        ├── 2.mp4
        ├── 2.json
        ├── 3.mp4
        └── 4.json

В

├── subdirectory-A
│   ├── JSON
        ├──1.json
        ├──2.json
        ├──3.json
│   ├── 1.mp4
│   ├── 2.mp4
│   ├── 3.mp4
└── subdirectory-B
    └── subdirectory-C
        ├── JSON
            ├──1.json
            ├──2.json
            ├──3.json
        ├── 1.mp4
        ├── 2.mp4
        ├── 3.mp4
2
задан 21 October 2019 в 00:25

2 ответа

Я принимаю это потому что Ваш оригинал find команда содержит a -prune (хотя неуместный), что также необходимо обработать случай где часть из .json файлы уже внутри JSON подкаталоги и не должны быть перемещены в JSON/JSON подкаталоги.

Поэтому Вы хотите к (1) файлы пропуска, которые уже находятся в a JSON подкаталог и (2) создает JSON подкаталоги при необходимости. Так

find . -type f -name '*.json' ! -path '*/JSON/*.json' -execdir sh -c '
        mkdir -p ./JSON
        for f; do 
          mv -vt ./JSON/ "$f"
        done
      ' find-sh {} +

Напр. данный:

$ tree subdirectory-*
subdirectory-A
├── 1.json
├── 1.mp4
├── 2.json
├── 2.mp4
├── 3.json
└── 3.mp4
subdirectory-B
└── subdirectory-C
    ├── 1.json
    ├── 1.mp4
    ├── 2.mp4
    ├── 3.json
    ├── 3.mp4
    └── JSON
        └── 2.json

2 directories, 12 files

затем

$ find . -type f -name '*.json' ! -path '*/JSON/*.json' -execdir sh -c '
    mkdir -p ./JSON
    for f; do 
      mv -vt ./JSON/ "$f"
    done
  ' find-sh {} +
renamed './1.json' -> './JSON/1.json'
renamed './3.json' -> './JSON/3.json'
renamed './nodes.json' -> './JSON/nodes.json'
renamed './test.json' -> './JSON/test.json'
renamed './test2.json' -> './JSON/test2.json'
renamed './file.json' -> './JSON/file.json'
renamed './data.json' -> './JSON/data.json'
renamed './1.json' -> './JSON/1.json'
renamed './2.json' -> './JSON/2.json'
renamed './3.json' -> './JSON/3.json'

получающийся в

$ tree subdirectory-*
subdirectory-A
├── 1.mp4
├── 2.mp4
├── 3.mp4
└── JSON
    ├── 1.json
    ├── 2.json
    └── 3.json
subdirectory-B
└── subdirectory-C
    ├── 1.mp4
    ├── 2.mp4
    ├── 3.mp4
    └── JSON
        ├── 1.json
        ├── 2.json
        └── 3.json

3 directories, 12 files

Можно удалить -v флаг от mv (который является только там в иллюстративных целях).

1
ответ дан 21 October 2019 в 17:53

mv (перемещение) команда и cp (копия) команды не создают каталоги как, они делают в Windows.

Это работает хотя:

# loop through all subdirectories
for d in $(find . -type d) ; do
    echo $d
    myarray=( $(find $d -maxdepth 1 -name "*.json") )
    if [ ${#myarray[@]} -gt 0 ]; then 
        mkdir -p $d/JSON/
        mv $d/*.json $d/JSON/
    fi
done
<час>

необходимо быть скептически настроены и протестировать сначала. Вот сценарий тестирования:

#!/bin/bash

# NAME: move (move file pattern to new sub-directory name)
# PATH: $HOME/askubuntu/
# DESC: Answer for: https://askubuntu.com/questions/1182501/move-files-from-its-current-directory-into-subdirectory
# DATE: October 20, 2019.

CreateFiles () {
mkdir -p subdir-A
mkdir -p subdir-B/subdir-C

echo "1 json" >> subdir-A/1.json
echo "2 json" >> subdir-A/2.json
echo "3 json" >> subdir-A/3.json
echo "4 json" >> subdir-A/4.json
echo "1 file" >> subdir-A/1.mp4
echo "2 file" >> subdir-A/2.mp4
echo "1 file" >> subdir-A/3.mp4

echo "1 json" >> subdir-B/subdir-C/1.json
echo "2 json" >> subdir-B/subdir-C/2.json
echo "3 json" >> subdir-B/subdir-C/3.json
echo "4 json" >> subdir-B/subdir-C/4.json
echo "1 file" >> subdir-B/subdir-C/1.mp4
echo "2 file" >> subdir-B/subdir-C/2.mp4
echo "1 file" >> subdir-B/subdir-C/3.mp4
}

tree -h subdir*

CreateFiles       # Only do this once then comment it out for next time.

# loop through all subdirectories
for d in $(find . -type d) ; do
    echo $d
    myarray=( $(find $d -maxdepth 1 -name "*.json") )
    if [ ${#myarray[@]} -gt 0 ]; then 
        mkdir -p $d/JSON/
        mv $d/*.json $d/JSON/
    fi
done

Вот то, что происходит, когда Вы выполняете его:

$ move

subdir-A
├── [   7]  1.json
├── [   7]  1.mp4
├── [   7]  2.json
├── [   7]  2.mp4
├── [   7]  3.json
├── [   7]  3.mp4
└── [   7]  4.json
subdir-B
└── [4.0K]  subdir-C
    ├── [   7]  1.json
    ├── [   7]  1.mp4
    ├── [   7]  2.json
    ├── [   7]  2.mp4
    ├── [   7]  3.json
    ├── [   7]  3.mp4
    └── [   7]  4.json

1 directory, 14 files
.
./subdir-B
./subdir-B/subdir-C
./subdir-A
subdir-A
├── [   7]  1.mp4
├── [   7]  2.mp4
├── [   7]  3.mp4
└── [4.0K]  JSON
    ├── [   7]  1.json
    ├── [   7]  2.json
    ├── [   7]  3.json
    └── [   7]  4.json
subdir-B
└── [4.0K]  subdir-C
    ├── [   7]  1.mp4
    ├── [   7]  2.mp4
    ├── [   7]  3.mp4
    └── [4.0K]  JSON
        ├── [   7]  1.json
        ├── [   7]  2.json
        ├── [   7]  3.json
        └── [   7]  4.json

3 directories, 14 files
0
ответ дан 21 October 2019 в 17:53

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

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