【问题标题】:Send files to folders using bash script使用 bash 脚本将文件发送到文件夹
【发布时间】:2020-12-20 11:55:48
【问题描述】:

我想复制一个名为 files2folder 的 Windows 程序的功能,它基本上可以让您右键单击一堆文件并将它们发送到它们自己的单独文件夹。

所以

1.mkv 2.png 3.doc

被放入名为

的目录中

1 2 3

我已经使用这个脚本让它工作了,但它有时会抛出错误,同时仍然完成我想要的操作

#!/bin/bash

ls > list.txt
sed -i '/list.txt/d' ./list.txt
sed 's/.$//;s/.$//;s/.$//;s/.$//' ./list.txt > list2.txt
for i in $(cat list2.txt); do
mkdir $i 
mv $i.* ./$i
done

rm *.txt

有没有更好的方法来做到这一点?谢谢

编辑:我的脚本因真实世界的文件名而失败,因为它们包含多个 .所以我不得不使用不同的 sed 命令使其工作。这是我正在使用的示例文件名

Captain.America.The.First.Avenger.2011.INTERNAL.2160p.UHD.BluRay.X265-IAMABLE

【问题讨论】:

  • 您“有时”会遇到什么错误?哦,我猜是... 目录。
  • mv: cannot stat 'foo.*': 没有这样的文件或目录,但检查目录的内容显示一切正常
  • 不是很清楚你想要什么。一个名为simon 的文件去哪里了?那一个叫abc-7.txt 呢? 345-678.doc 呢?

标签: bash file directory


【解决方案1】:

我猜你在... 上遇到了错误,所以将你对ls 的调用改为:

ls -A > list.txt

-A 列出除 .和 ... 始终为超级用户设置。

您不必创建文件即可获得相同的结果,只需将 ls 命令的输出分配给变量即可。做这样的事情:

files=`ls -A`
for file in $files; do
  echo $file
done

你也可以像这样检查资源是否是文件或目录:

files=`ls -A`
for res in $files; do
  if [[ -d $res ]];
  then
    echo "$res is a folder"
  fi
done

【讨论】:

  • 哦,我没有看到您实际上删除了这些条目 =) 无论如何使用 -A 标志,您不需要过滤任何内容。
  • 另外,实际上不需要为此创建文件,而是将ls 的输出通过管道传递给变量。
  • 你能给我举个例子吗?
  • 完成。以上仍然无法解决您有时遇到的错误,但我认为它更合适,因为您不必过滤和创建任何临时文件 =)
  • 哦,抱歉没有测试上面的 =) 现在应该可以了。
【解决方案2】:

这个脚本会满足你的要求:

files2folder:

#!/usr/bin/env sh

for file; do
  dir="${file%.*}"
  { ! [ -f "$file" ] || [ "$file" = "$dir" ]; } && continue
  echo mkdir -p -- "$dir"
  echo mv -n -- "$file" "$dir/"
done

示例目录/文件结构:

ls -1 dir/*.jar
dir/paper-279.jar
dir/paper.jar

运行上面的脚本:

chmod +x ./files2folder
./files2folder dir/*.jar

输出:

mkdir -p -- dir/paper-279
mv -n -- dir/paper-279.jar dir/paper-279/
mkdir -p -- dir/paper
mv -n -- dir/paper.jar dir/paper/

要使其真正创建目录并移动文件,请删除所有 echo

【讨论】:

  • 嘿,感谢您的评论,我不得不编辑我的脚本,因为它因文件超过一个而失败。在名称中我正在使用媒体文件,在简单目录上进行了测试,但在更复杂的名称上失败了使用新的 sed 命令编辑了原始脚本,您的脚本似乎对更大的文件名没有任何作用。
  • @HaniUmer 我很难理解您的评论。似乎对更大的文件名没有任何作用这是什么意思?
  • @HaniUmer 修改了脚本以仅删除最右边的点扩展名,并使用Captain.America.The.First.Avenger.2011.INTERNAL.2160p.UHD.BluRay.X265-IAMABLE.divx 文件名测试它是否正常工作
猜你喜欢
  • 2012-07-29
  • 2017-11-09
  • 2016-01-27
  • 2021-12-26
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多