【问题标题】:move files from subdirectory into parent folder with same name将文件从子目录移动到同名的父文件夹
【发布时间】:2019-08-23 09:19:37
【问题描述】:

我每年都有几个文件夹,在这些文件夹内有对应于不同电台的文件。有点像这样:

.
├── 2017.1
│   ├── AAAA.2017
│   ├── BBBB.2017
│   └── CCCC.2017
├── 2018.1
│   ├── AAAA.2018
│   ├── BBBB.2018
│   └── CCCC.2018
└── 2019.1
    ├── AAAA.2019
    ├── BBBB.2019
    └── CCCC.2019

我想要做的是将所有这些文件移动到主目录“。”根据他们的名字,所以它会是这样的:

├── AAAA
│   ├── AAAA.2017
│   ├── AAAA.2018
│   └── AAAA.2019
├── BBBB
│   ├── BBBB.2017
│   ├── BBBB.2018
│   └── BBBB.2019
├── CCCC
│   ├── CCCC.2017
│   ├── CCCC.2018
│   └── CCCC.2019

我尝试了一些简单的代码,在其中创建文件夹并根据它们的站点简单地移动文件。我想知道是否有更“优雅”或更简单的方法

mkdir AAAA BBBB CCCC
for file in 20*/AAAA*; do
        cp "$file" "/Users/admin/Desktop/test/AAAA"
done
for file in 20*/BBBB*; do
        cp "$file" "/Users/admin/Desktop/test/BBBB"
done
for file in 20*/CCCC*; do
        cp "$file" "/Users/admin/Desktop/test/CCCC"
done

【问题讨论】:

  • 文件名的格式是什么?都以.20XX结尾,新的目录名应该是那个时期之前的所有内容吧?
  • 它们以不同的方式结束,但它们都以相同的方式开始。我的意思是,您有以 AAAA 开头的文件和其他以 BBBB 开头的文件,它们分散在不同的文件夹中。目录应该以文件的前四个字母命名,因为只有五个变体,所以应该只有五个目录

标签: macos shell


【解决方案1】:

我建议使用while循环解决方案。

SRC_DIR=/path/to/dir
DEST_DIR=/tmp

cd "${SRC_DIR}"

find . -type f \
  | while read -r FILE; do
    BASENAME=${FILE##*/}
    mkdir -p "${DEST_DIR}/${BASENAME%.*}" && cp -a $FILE "${DEST_DIR}/${BASENAME%.*}"
  done

【讨论】:

  • 我试过了,但它不起作用。我不得不将 FILE 更改为 file,因为 shell 无法识别它,但我不明白 DEST_DIR 是如何工作的,因为我的目标目录都是不同的。还是我不理解脚本背后的逻辑?
  • 因为我从这个脚本中理解它是在 year 文件夹中创建一个文件夹,或者我根本不理解