我有这个 bash 脚本,它可以很好地按 cron 计划备份我的数据库:
#!/bin/sh
PT_MYSQLDUMPPATH=/usr/bin
PT_HOMEPATH=/home/philosop
PT_TOOLPATH=$PT_HOMEPATH/philosophy-tools
PT_MYSQLBACKUPPATH=$PT_TOOLPATH/mysql-backups
PT_MYSQLUSER=*********
PT_MYSQLPASSWORD="********"
PT_MYSQLDATABASE=*********
PT_BACKUPDATETIME=`date +%s`
PT_BACKUPFILENAME=mysqlbackup_$PT_BACKUPDATETIME.sql.gz
PT_FILESTOKEEP=14
$PT_MYSQLDUMPPATH/mysqldump -u$PT_MYSQLUSER -p$PT_MYSQLPASSWORD --opt $PT_MYSQLDATABASE | gzip -c > $PT_MYSQLBACKUPPATH/$PT_BACKUPFILENAME
Run Code Online (Sandbox Code Playgroud)
问题在于它会继续转储文件夹中的备份,而不是清理旧文件。这就是变量的PT_FILESTOKEEP用武之地。无论设置为多少,这就是我想要保留的备份数量。所有备份都带有时间戳,因此通过按名称 DESC 对其进行排序,您将首先获得最新的备份。
任何人都可以帮我完成 BASH 脚本的其余部分来添加文件清理吗?我缺乏 bash 的知识,我无法拼凑代码来完成其余的工作。
是否有与 futurama 上的黑板颜色相匹配的 BASH shell 配色方案?

(如果重要的话,我在 OSX 上。)
可能的重复:
在未登录的情况下让 bash 脚本在远程终端上运行?
我有一个运行 Gaussian 的 bash 脚本,这是一个化学结构计算器,它花了几天时间来处理一个分子。它在 Linux 机器上运行,我将输入文件和上述脚本加载到该机器上,然后我(应该)运行它,等待一段时间,希望程序没有崩溃,然后重新登录以收集结果。
有点像 *nx 新手,但我似乎无法弄清楚如何设置脚本运行和断开连接,同时让它继续运行。
./jobscript
Run Code Online (Sandbox Code Playgroud)
似乎阻塞直到它完成,如果我断开它终止
./jobscript &
Run Code Online (Sandbox Code Playgroud)
没有阻塞,我可以看到它在运行top,所以我认为它没问题,但是在注销时它显然杀死了程序。
即使我注销,我如何设置它运行并保持运行?
我想ls根据文件大小过滤命令的输出。任何大于 100KB 的 .jpg 或 .png 文件都应在输出中报告。
我已经能够过滤 .png / .jpg 文件,但我无法丢弃任何小于 100KB 的文件。
这是我目前正在使用的:
ls -lah | grep '.png\|.jpg'
Run Code Online (Sandbox Code Playgroud)
任何想法我怎么能做到这一点?
我在 Windows 7 上使用 Git bash。有时,当我在一个包含很多文件的文件夹中并且当我输入时
$ ls
Run Code Online (Sandbox Code Playgroud)
shell 显示不止一个屏幕的内容。为了查看完整的结果,我必须伸手去拿鼠标并进行一些滚动。有什么方法可以让我只用键盘滚动 shell 窗口?
[(不太理想)修复 1] 我知道你可以使用滚动浏览结果
$ ls | less
Run Code Online (Sandbox Code Playgroud)
但我觉得添加 | 每次都少,工作量太大。所以请不要建议将此作为答案。
[编辑 1]此处使用ls只是返回多个屏幕输出的任何命令的示例。因此,请不要将您的答案集中在 ls 命令并提供解决使用键盘在命令提示符上滚动问题的答案
我一直在尝试以不同的用户身份运行应用程序。
尝试 1
sudo -u otheruser open /Applications/TextEdit.app启动应用程序,但它使用当前用户,而不是otheruser。
尝试2
login username并su - otheruser成功登录为otheruser,不同的用户活动监控器弹出,但类似open /Applications/TextEdit.app回报的错误LSOpenURLsWithRole() failed with error -10810 for the file /Applications/TextEdit.app.
尝试 3
sudo su - otheruser -c /Applications/TextEdit.app/Contents/MacOS/TextEdit似乎启动了该应用程序(它出现在由otheruser启动的 Activity Monitor 下)但是当停靠栏图标无限期地弹跳时会出现此错误:_RegisterApplication(), FAILED TO establish the default connection to the WindowServer, _CGSDefaultConnection() is NULL.
问题
那么……我如何以不同的用户身份运行应用程序?
使用 Windows,即使没有收到回复,您也可以 ping 给定的域名并将 IP 作为变量捕获。我相信命令看起来像这样:
ping domain.com
for /f "tokens=1,2 delims=[]" %%A in ('ping /n 1 /w 1 domain.com ^| find "Pinging"') do set ipaddress=%%B"`
Run Code Online (Sandbox Code Playgroud)
这基本上就是我想要做的,但是在 bash 脚本而不是批处理文件中。我偶然发现了很多非常接近的问题,但并不是我想要的。我似乎无法找出解决此问题的最佳方法。
有任何想法吗?
我正在处理一大群无组织的媒体文件,这些文件是使用几种不同的相机和摄像机捕获的,我想在 bash 脚本中使用 exiftool 来重命名每个文件及其创建日期和时间、制造商和型号。
使用此命令,图像将根据需要重命名:
exiftool -m -P '-filename<${DateTimeOriginal}_${Make}_${Model}.%e' myfile.jpg
Run Code Online (Sandbox Code Playgroud)
我已经知道我可以使用 -d FMT 选项格式化日期和时间,但为了清楚起见我省略了它。
这是我在使用 DSLR“*.mov”视频时面临的问题:
有谁知道如何“强制”exiftool 使用原始的 .mov 扩展名?
有没有办法告诉 exiftool 检查 exif 标签是否存在?如果第一个标签不存在,则使用另一个标签?
我试过类似的东西
if [ -n `exiftool -m -p '$DateTime' filename]
then
...
Run Code Online (Sandbox Code Playgroud)
但是 exiftool 给我一个错误,所以空字符串检查总是失败。任何提示?
当我分离命令时:
$ command &
Run Code Online (Sandbox Code Playgroud)
结果是 STDOUT 的打印输出:
[1] < PID >
Run Code Online (Sandbox Code Playgroud)
我想监控这个PID。但是,除了 STDOUT,我不能在任何地方写这个输出!如何将其重定向到文件或变量?
我试过了:
$ command 1> ./temp.txt &
Run Code Online (Sandbox Code Playgroud)
但这仍然找到了标准输出的方法!
在此先感谢您的帮助!
1) 在 Mountain Lion 中,您可以通过 Preferences 更改终端的设置,以便在与打开选项卡相同的目录中打开一个新选项卡。(即,如果我在 ~/workspace 并打开一个新选项卡,则新选项卡将位于 ~/workspace)。
2) 同样在 Mountain Lion 中,可以通过 ~/.profile 中的以下指令让选项卡的标题自动反映当前目录的基本名称:
# automatically change the title of the terminal window to the directory basename
PROMPT_COMMAND='echo -n -e "\033]0;${PWD##*/}\007"'
Run Code Online (Sandbox Code Playgroud)
但是,这似乎也消除了终端在与打开选项卡相同的目录中打开新选项卡的能力。也就是说,有 2) 似乎使 1) 无效。有没有办法解决这个问题,让这两件事可以同时发生?
