【问题标题】:Bash moving files to their destination foldersBash 将文件移动到目标文件夹
【发布时间】:2020-07-17 11:04:06
【问题描述】:

我有这样的文件夹

parent
|-- output
    |-- 1.Abby
    |   |-- s001_clean.log
    |   |-- s001_clean.idx
    |   |-- s002_clean.log
    |   `-- s002_clean.idx
    |-- 2.Chris
    |   |-- s001.ppt
    |   `-- s002.ppt
    |-- 3.Bobby
        |-- s001.tar.gz
        `-- s002.tar.gz

我想把它们修改成这个

parent
|-- s001
    |-- 1.Abby
    |   |-- s001_clean.log
    |   `-- s001_clean.idx
    |-- 2.Chris
    |   `-- s001.ppt
    |-- 3.Bobby
    |   `-- s001.tar.gz
|-- s002
    |-- 1.Abby
    |   |-- s002_clean.log
    |   `-- s002_clean.idx
    |-- 2.Chris
    |   `-- s002.ppt
    |-- 3.Bobby
        `-- s002.tar.gz

到目前为止,我已经成功创建了 s001/s002 和 Abby/Chris/Bobby 文件夹。
但是,当我尝试将文件移动到里面时,我只得到了 .log 文件来移动到它的目的地。

  '''
  #!/usr/bin/env bash

  aa='1.A'
  bb='2.B'
  cc='3.C'


  for s in output/"$aa"/*_c*; do
    sn=${s%%_*}
    sn=${sn##*/}

    mkdir -p "${sn}"/$aa
    mkdir -p "${sn}"/$bb
    mkdir -p "${sn}"/$cc


  done
   '''

我真的不知道从这里怎么走。
如何将文件移动到目标目录?

另外,有没有办法可以使 mkdir 部分更短?
我尝试了几种方法,但没有奏效。

如果有人可以提供帮助,那就太好了。
谢谢

【问题讨论】:

  • mkdir -p "${sn}"/{$aa,$bb,$cc}
  • 我试过了。结果是这样的: 2.childB, ||| 3.childC} ||| {1.childA,在 s1 ||| {1.childA,在 s2 中
  • 我的回答不需要,但请尝试echo mkdir s{1,2}/{$aa,$bb,$cc},不要附加引号。
  • 我用mkdir -p output/{1.A,2.B,3.C}; touch output/1.A/s{1,2}_clean.{idx,log};touch output/2.B/s{1,2}.ppt;touch output/3.C/s{1,2}.tar.gz 生成了测试数据。将此添加到您的问题中时,您可能会获得额外的“好问题”分数。

标签: bash loops


【解决方案1】:

使用if grep -q "$sn" "$i",您在文件内容中查找$sn,而不是名称。
使用类似的东西

if grep -q "$sn" <<< "$i";

if [[ $i = $sn* ]];

更改此设置后,您的代码不会移动所有文件。
我会使用类似的东西

aa='1.childA' # original question, after edit aa=1a
while IFS=/ read -r s_output s_child s_file; do
   sn=${s_file%%_*}
   # debug echo "sn=$sn"
   while IFS=/ read -r output child file; do
      # Debug echo "sn=$sn f=$file"
      test -d "${sn}/${child}" || mkdir -p "${sn}/${child}"
      mv "output/$child/$file" "${sn}/${child}"
   done < <(find output -mindepth 2 -type f -name "${sn}*")
done < <(find output/$aa/ -name "*_*" -type f)

【讨论】:

  • 嗨,非常感谢您抽出宝贵的时间。我在帖子中使用了常用词是我的错。实际上,我想要创建的其他文件夹与其他文件夹不常见。你能告诉我如何对付他们吗?谢谢~
  • 我不明白您要创建哪些目录。当您将原始文件的路径分成几部分时,您可以使用这些部分来构建新路径。也许您想将mv "output/... 更改为mv "$output/...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 2011-08-18
  • 2018-08-12
  • 1970-01-01
  • 2013-04-28
  • 2017-07-01
相关资源
最近更新 更多