需要简单的BASH脚本:移动和重命名文件
几十年前,我是一名程序员(IBM汇编、Fortran、COBOL、MS DOS脚本、一点Visual Basic)。因此,我熟悉IF-Then-Else、For循环等的一般性 然而,我现在需要为我目前的工作深入研究Bash,我在语法和适当的命令方面遇到了困难 我需要一个简单的(概念方面的)脚本,它将:需要简单的BASH脚本:移动和重命名文件,bash,timestamp,renaming,Bash,Timestamp,Renaming,几十年前,我是一名程序员(IBM汇编、Fortran、COBOL、MS DOS脚本、一点Visual Basic)。因此,我熟悉IF-Then-Else、For循环等的一般性 然而,我现在需要为我目前的工作深入研究Bash,我在语法和适当的命令方面遇到了困难 我需要一个简单的(概念方面的)脚本,它将: 确定用户桌面上是否存在特定文件夹(例如,~/Desktop/Archive文件夹) 如果没有,则创建它(“归档”) 将桌面上的所有文件/文件夹(除了~/desktop/Archive)移动到“Ar
~/Desktop/Archive
文件夹)~/desktop/Archive
)移动到“Archive Folder”中,并在要移动的文件名末尾添加时间戳#!/bin/bash
shopt -s extglob
FOLDERARCH="Archive Folder"
cd ~/Desktop
if [ ! -d $"FOLDERARCH" ]; then
mkdir "$FOLDERARCH"
echo "$FOLDERARCH did not exist, was created"
fi
mv !(-d "$FOLDERARCH") "$FOLDERARCH"
最后一点注意:上面的脚本可以工作(没有时间戳),但也以消息结尾
mv: rename Archive Folder to Folder/Archive Folder: Invalid argument
为什么?
我们将非常非常感谢您的帮助。请假设我对BASH环境、cmds及其论点基本上一无所知——这第一次请求帮助标志着我至少在精通BASH的过程中迈出了第一步
更新
第一:非常感谢我得到的回复;它们非常有用
我现在得到了它基本上是一个工作版本,但有一些奇怪的地方我不明白,经过几个小时的尝试研究,我还没有理解/解决
我希望有一些见解;我觉得我在理解方面即将取得一些真正的进展,但这些异常现象阻碍了我的进步。以下是迄今为止我的(处理“问题”)代码:
shopt -s extglob
FOLDERARCH="Archives"
NEWARCH=$(date +%F_%T)
cd ~/Desktop
if [ ! -d $"FOLDERARCH" ]; then
mkdir "$FOLDERARCH"
echo "$FOLDERARCH did not exist, was created"
fi
mkdir "$FOLDERARCH/$NEWARCH"
mv !(-d "$FOLDERARCH") $FOLDERARCH/$NEWARCH
这实际上基本上实现了我的目标,但是:
- 在桌面存档文件夹已经存在的情况下,我希望if-then构造简单地遵循以下mkdir命令(不带echo msg),但是无论如何都会输出msg“Archives not exist,was created”msg(错误)。有什么原因的答案吗
- 脚本完成时显示以下消息:
mv: rename Archives to Archives/2016-01-10_00:06:54/Archives: Invalid argument
/desktop/Archives
文件夹之外,桌面上的所有文件/文件夹都应移动到新创建的/desktop/Archives
的“子文件夹”中,例如/desktop/Archives/2016-01-10_00:06:54
。事实上,这一举措实现了我的目标,但这一信息的出现对我来说毫无意义。无效论点是什么
最后一点注意:在我的新手状态下,我正在寻找清晰易读的代码,而不是更优雅/复杂的单线管道命令解决方案。我期待着在适当的时候努力达到这些目标。你有几个选择。最简单的方法之一是循环浏览
~/Desktop
下面的目录,如果它们不是“$FOLDERARCH”
,请将它们移动到“$FOLDERARCH”
,例如:
for i in */; do
[ "$i" != "$FOLDERARCH"/ ] && mv "$i" "$FOLDERARCH"
done
我还没有运行测试用例,但是类似于以下内容的东西应该可以工作
#!/bin/bash
shopt -s extglob
FOLDERARCH="Archive Folder"
cd ~/Desktop || { printf "failed to change to '~/Destop'\n"; exit 1; }
if [ ! -d "$FOLDERARCH" ]; then
if mkdir "$FOLDERARCH" , then
echo "$FOLDERARCH did not exist, was created"
else
echo "error: failed to create '$FOLDERARCH'"
exit 1
fi
fi
for i in */; do
[ "$i" != "$FOLDERARCH"/ ] && mv "$i" "$FOLDERARCH"
done
很抱歉,我忘了邮戳部分。正如评论中所指出的,您可以使用类似于以下内容的内容包含日期戳(根据您的喜好设置格式):
tstamp=$(date +%s)
for i in */; do
[ "$i" != "$FOLDERARCH"/ ] && mv "$i" "$FOLDERARCH/${i}_${tstamp}"
done
OP询问要附加的时间戳,比如
mv“$i”“$FOLDERARCH/${i}$(date+%s)”
也许吧?很抱歉,我被那个请求搞砸了。是的,你是对的,你的邮戳会很好用的。邮戳的格式可以根据口味进行调整。谢谢。我向这里的社区表示歉意——在我被安排到其他项目后,我刚刚回到这里。不幸的是,我仍然有这个琐碎的任务的问题。我必须在明天(1月25日星期一)之前运行它,所以任何帮助都将是巨大的。我希望我能在这里以一种连贯的格式粘贴代码:顺便说一下,我在这些窗口中键入代码时经历了一段糟糕的时光,并让它保留了正确的逐行格式——在我看来,在我看来,它在运行时没有换行符。如果这是其他人的观点,请帮助我连贯地格式化。