unix根据名称字符串将文件重新组织到子目录中

axr492tv  于 2023-10-18  发布在  Unix
关注(0)|答案(1)|浏览(149)

我希望将文件(abc1_gffabc2_gff等)从当前目录(cds.gff)移动到新的,预先存在的文件夹中,这些文件夹在名称(example_name_abc1example_name_abc2等)的末尾匹配“abc#“。下面是一个视觉效果:

[Linux@vaughan test]$ tree
.
├── cds.gff
│   ├── abc1_cds
│   ├── abc1_cds.gff
│   ├── abc2_cds
│   ├── abc2_cds.gff
│   └── abc_cds
├── example_name_abc1
│   └── distraction_abc1.txt
├── example_name_abc2
│   └── abc2_distraction_abc2.txt
└── move_files.sh

我希望abc1_cds.gff被移动到example_name_abc1中,abc2_cds.gff被移动到example_name_abc2中,没有额外的更改。下面是move_files.sh脚本:

#!/bin/bash

# Iterate over files in the "cds.gff" directory
for file in cds.gff/*.gff; do
  # Extract the filename without the path
  filename="${file##*/}"

  # Extract the last part of the folder name
  last_part_of_folder="${filename%_cds.gff}"

  # Check if there's a matching folder in the current directory
  if [ -d "$last_part_of_folder" ]; then
    # Move the file to the matching folder
    mv "$file" "$last_part_of_folder/"
  fi
done

这在运行./move_files.sh后不会对任何文件位置产生任何更改(并且它是可执行的)。任何想法欢迎

svujldwt

svujldwt1#

这一行并没有达到你所期望的效果:

if [ -d "$last_part_of_folder" ]; then

如果它测试是否有一个目录的文字名称保存在$last_part_of_folder中;例如,是否存在名为abc1的目录。你需要用一句话来开头:

if [ -d *_"$last_part_of_folder" ]; then

当然,如果有两个(或更多)目录有相同的最右边的子字符串,这是有风险的。您还需要对mv命令进行相同的更改。在启用跟踪的情况下运行这种类型的脚本通常很有帮助:bash -x path-to-script

相关问题