Modify a directory without changing the timestamp - shell

Is there a way to copy file A into directory B without changing B's timestamps? If yes, then what is it?
edit:
The larger goal: I'm digging through some code I wrote more than a year ago. I found that there were somethings I did which will always be confusing to my future self. I want to add a README file there explaining the gotcha. But I want to preserve the last time I worked in that directory.
Finally:
Thanks for both the answers. I ended up doing "touch -r B/newestoldfile B" which was good enough for my purpose. Even though like someone pointed out, that isn't the exact answer to my question in all circumstances. I voted up both the answer but had to pick on as accepted. I chose the one that briefly mentioned the -r option :)

Capture the old mtime of the B directory. Then move the file, then rewrite the mtime of the B directory with old mtime that you have stored, using the touch command.
old_mtime=$(stat -c%Y B)
mv A B
touch -d"$(date --date="#$old_time")" B
We use #$old_time to create the date representing by $old_time seconds since epoch, which is what stat gives us.

You can take the timestamp from the directory before copying with stat -c %Y and then use the touch command to modify the timestamp after.
If you simply want to copy the timestamp from directory A to B :
touch -r A B

When you code, you should use a Source Control System like Git, Mercurial or Subversion. It allows you to create a repository of the files of your project, edit the files, register the versions with comments on what you changed, eventually merge the edited files into the project, host it in the cloud by using a distributed system.
Others already replied correctly referring to the method you mentioned, but i wanted to give you a better suggestion using another solution that you'd better use also in the future.

Related

Using 7za x -aou to extract multiple files and keeping duplicates results in duplicate files having creation dates 1 hour apart, why?

I currently have about 102 zip files, of which I would like to combine them into one folder. A lot of the files within the zip files between zip files have the same name and content. I do not want them to overwrite. I used the following command:
7za x '*.zip' -aou -o/Path/To/Export/To
This works fine in that, say if zipfile1.zip and zipfile2.zip had the same file called IMG.jpg, with the EXACT contant, it would create two names, one with IMG.jpg and the other with IMG_1.jpg.
HOWEVER, I noticed that upon comparing the files, the creation/modification time was off by 1 hour. Is there a reasonable explanation for why?
According to this forum, it is not supported to preserve creation time due to lack of interest in the 7-zip team. It's not a great answer, but it seems to be the answer.

Search an image in a directory

I have a project in which I have lots of different images. Once in a while, we are adding more images inside it, but before, we need to check if it already existed (because we added it previously).
We were doing this right now manually, looking for the image in the folders, but as the project got bigger, it's pretty time consuming.
SO, I would like to create a script that given an image, it looks in a directory to check if it exists.
Do you know if there is any command line based tool or something I can use to build a script to do this?
There is the fdupes utility which does byte to byte comparison. It has a -d or --delete option which will prompt you to ask which files it should keep when it finds duplicates. If you don't care about the filename you can ask it to keep only the first one:
fdupes --delete --noprompt
If you want to delete images that look the same but are slightly different, it's an image recognition problem which I guess does not have such a straightforward solution.

How to create or update mtime of a directory by using Ruby

I want to create a directory and if already the directory exists, update the mtime of it.
This is what I wrote:
Dir.exist?(dir) ? FileUtils.touch(dir) : FileUtils.mkdir_p(dir)
Is there better way to enable it?
ctime cannot be updated, since it is creation time(*). See here for what POSIX says about it. If you really, really want to set the ctime, move the original directory out of the way, make a new one (this step sets ctime), move all the original contents to the new one, delete the old one.
Your code should be correct for updating mtime (modification time), though.
(*) Or rather, depending on your OS and filesystem, it can, if you hack at it, but you really, really shouldn't.

Purpose of "$Id: ..." line in the header of source files

/* $Id: file.c,v 1.0 2010/09/15 01:12:10 username Exp $ */
I find this line in many source code files in the comment at the top (header) of the file. Why? Is it aimed for the version control software? -Thanks.
These sort of comments are automatically modified by various source code control systems, things like author, date, history and so forth.
See here for some common ones for RCS which is the first source code control system I ever saw to implement this sort of thing (that doesn't mean it was the first, just that RCS was the first I ever used and it had that capability).
One particular trick we used to use was to put the line:
static char *fileId = "$Id: $";
into the source file (and header files as well, although the names had to be unique) so that, when it was built, it would automatically have the ID of the files in the executable itself.
Then we could use something like strings to find out which source files were used to build the executable. Ideal for debugging problems in the field.
It tells CVS (and other VCSs) to expand the value of the Id at check-out time, so anybody reading the source file in question will know what version exactly was checked out for it. Not very popular any more (you can always ask your VCS for such info if you keep the source file in a client / repository / working directory -- or however else your VCS calls such things;-).
I believe you are correct. It appears to be a keyword substitution string for CVS.
Take a look at this question $id: name of file, date/time creation Exp $

Can Mac OS X's Spotlight be configured to ignore certain file types? [closed]

Closed. This question is off-topic. It is not currently accepting answers.
Want to improve this question? Update the question so it's on-topic for Stack Overflow.
Closed 10 years ago.
Improve this question
I've got bunches of auxiliary files that are generated by code and LaTeX documents that I dearly wish would not be suggested by SpotLight as potential search candidates. I'm not looking for example.log, I'm looking for example.tex!
So can Spotlight be configured to ignore, say, all .log files?
(I know, I know; I should just use QuickSilver instead…)
#diciu That's an interesting answer. The problem in my case is this:
Figure out which importer handles your type of file
I'm not sure if my type of file is handled by any single importer? Since they've all got weird extensions (.aux, .glo, .out, whatever) I think it's improbable that there's an importer that's trying to index them. But because they're plain text they're being picked up as generic files. (Admittedly, I don't know much about Spotlight's indexing, so I might be completely wrong on this.)
#diciu again: TextImporterDontImportList sounds very promising; I'll head off and see if anything comes of it.
Like you say, it does seem like the whole UTI system doesn't really allow not searching for something.
#Raynet Making the files invisible is a good idea actually, albeit relatively tedious for me to set up in the general sense. If worst comes to worst, I might give that a shot (but probably after exhausting other options such as QuickSilver). (Oh, and SetFile requires the Developer Tools, but I'm guessing everyone here has them installed anyway :) )
#Will - these things that define types are called uniform type identifiers.
The problem is they are a combination of extensions (like .txt) and generic types (i.e. public.plain-text matches a txt file without the txt extension based purely on content) so it's not as simple as looking for an extension.
RichText.mdimporter is probably the importer that imports your text file.
This should be easily verified by running mdimport in debug mode on one of the files you don't want indexed:
cristi:~ diciu$ echo "All work and no play makes Jack a dull boy" > ~/input.txt
cristi:~ diciu$ mdimport -d 4 -n ~/input.txt 2>&1 | grep Imported
kMD2008-09-03 12:05:06.342 mdimport[1230:10b] Imported '/Users/diciu/input.txt' of type 'public.plain-text' with plugIn /System/Library/Spotlight/RichText.mdimporter.
The type that matches in my example is public.plain-text.
I've no idea how you actually write an extension-based exception for an UTI (like public.plain-text except anything ending in .log).
Later edit: I've also looked though the RichText mdimporter binary and found a promising string but I can't figure out if it's actually being used (as a preference name or whatever):
cristi:FoodBrowser diciu$ strings /System/Library/Spotlight/RichText.mdimporter/Contents/MacOS/RichText |grep Text
TextImporterDontImportList
Not sure how to do it on a file type level, but you can do it on a folder level:
Source: http://lists.apple.com/archives/spotlight-dev/2008/Jul/msg00007.html
Make spotlight ignore a folder
If you absolutely can't rename the folder because other software depends on it another technique is to go ahead and rename the directory to end in ".noindex", but then create a symlink in the same location pointing to the real location using the original name.
Most software is happy to use the symlink with the original name, but Spotlight ignores symlinks and will note the "real" name ends in *.noindex and will ignore that location.
Perhaps something like:
mv OriginalName OriginalName.noindex
ln -s OriginalName.noindex
OriginalName
ls -l
lrwxr-xr-x 1 andy admin 24 Jan 9 2008
OriginalName -> OriginalName.noindex
drwxr-xr-x 11 andy admin 374 Jul 11
07:03 Original.noindex
Here's how it might work.
Note: this is not a very good solution as a system update will overwrite changes you will perform.
Get a list of all importers
cristi:~ diciu$ mdimport -L
2008-09-03 10:42:27.144 mdimport[727:10b] Paths: id(501) (
"/System/Library/Spotlight/Audio.mdimporter",
"/System/Library/Spotlight/Chat.mdimporter",
"/Developer/Applications/Xcode.app/Contents/Library/Spotlight/SourceCode.mdimporter",
Figure out which importer handles your type of file (example for the Audio importer):
cristi:~ diciu$ cat /System/Library/Spotlight/Audio.mdimporter/Contents/Info.plist
[..]
CFBundleTypeRole
MDImporter
LSItemContentTypes
public.mp3
public.aifc-audio
public.aiff-audio
Alter the importer's plist to delete the type you want to ignore.
Reimport the importer's types so the system picks up the change:
mdimport -r /System/Library/Spotlight/Chat.mdimporter
The only option probably is to have them not indexed by spotlight as from some reason you cannot do negative searches. You can search for files with specifix file extension, but you cannot not search for ones that don't match.
You could try making those files invisible for Finder, Spotlight won't index invisible files. Command for setting the kIsInvisible flag on files is:
SetFile -a v [filename(s)]

Resources